Проблема с циклом 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 потоке.

→ Ссылка