簡體   English   中英

任務繼續阻止UI線程

[英]Task continuation blocking UI thread

我正在編寫一個連續的輪詢循環來監視某些事件發生,然后在UI線程上采取一些操作。

我正在編寫以下代碼

public static void HandlePopup(this HostedControl control, string className, string caption, System.Action callback)
    {
        var popupTask = Task.Factory.StartNew(() =>
        {
            Thread.Sleep(5000); // just wait for 5 seconds.
        }, CancellationToken.None, TaskCreationOptions.None, TaskScheduler.Default).ContinueWith((prevTask) =>
        {
            AutomationElementCollection collection = null;
            do
            {

            } while (true);
        }, CancellationToken.None, TaskContinuationOptions.None, TaskScheduler.FromCurrentSynchronizationContext()).ContinueWith((prevTask) =>
        {
            if (!prevTask.IsFaulted)
            {
                if (control.InvokeRequired)
                {
                    control.Invoke(callback);
                }
                else 
                {
                    callback();
                }
            }
        }, CancellationToken.None, TaskContinuationOptions.None, TaskScheduler.FromCurrentSynchronizationContext());

        try
        {
            ////popupTask.Wait();
        }
        catch (AggregateException ex)
        {
            ex.Handle(exnew =>
            {
                return true;
            });
        }
    }

do while循環現在沒有任何代碼,因為我想測試一下,如果我無限地運行一個循環,UI不會阻塞,但是,它沒有按預期工作,當代碼運行這個循環時(永遠不會返回) UI凍結並變得無法響應,直到我打破了運行。

我該怎么做才能讓它在后台默默運行

注意:調用此方法的父級是Web瀏覽器控件s documentcompelte`事件。 Web瀏覽器控件位於Windows窗體應用程序中。

您通過指定明確告知繼續在當前同步上下文中運行

TaskScheduler.FromCurrentSynchronizationContext()

所以是的,這將阻止UI線程,因為它在UI線程中運行,假設在UI線程中調用了這個整體方法。 原始任務將在后台運行,但您的延續都計划在UI線程中運行。 如果您不想這樣做,請不要使用該任務計划程序。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM