Проблема с циклом While и постоянной проверкой условия
Имею след. цикл:
while (isReady == false)
{
if (Clipboard.ContainsText() == true)
{
textCopy = Clipboard.GetText();
isReady = linkChecking(out readyText, textCopy);
}
}
Мне нужно чтобы он работал всегда, пока не найдёт то, что мне нужно. Он так и делает, но когда находит в буфере обмена текст, он немного зависает, а потом выдаёт результат (верный). Но мне нужно, чтобы он работал без прерываний, подзависаний.
Я проверял без цикла, он сразу за меньше секунды делал то, что нужно. Следовательно это из-за цикла.
Заранее спасибо
Ответы (1 шт):
Автор решения: return
→ Ссылка
Clipboard не подходит для ваших целей, т. к. Clipboard.GetText обязан выполняться в UI потоке, а создавать бесконечный цикл в UI потоке... ну такое. Метод решения тут 1: создать свой Clipboard-подобный класс:
static SharedDataManager
{
static readonly object syncRoot = new object();
static string? text;
public string? Text
{
get { lock (syncRoot) { return text; } }
set { lock (syncRoot) { text = value; } }
}
}
async ValueTask<string> GetTextAsync()
{
await Task.Run(() => { });
string coercedText;
var stopwatch = new Stopwatch();
stopwatch.Start();
while (true)
{
var text = SharedDataManager.Text;
if (text != null && // аналог `Clipboard.ContainsText()`
TryCoerceText(text, out coercedText)) // аналог `lineChecking`
break;
}
stopwatch.Stop();
MessageBox.Show($"{coercedText} at {stopwatch.ElapsedMilliseconds - 1000} ms");
return coercedText;
}
async ValueTask SetTextAsync(string text)
{
await Task.Run(() => { });
await Task.Delay(1000);
SharedTextManager.Text = text;
}
void Window_Loaded(object sender, RoutedEventArgs args)
{
// не ожидаем задачи в UI потоке – нам не важен результат
_ = GetTextAsync(); // чтоб заткнуть компилятор
_ = SetTextAsync(<text>); //
}
Вывод в msgbox:
<coerced text> at <1-10> ms
Проблема не в цикле, а в том, что вы его создали в UI потоке.