加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 任务继续阻止UI线程

发布时间:2020-12-15 17:36:17 所属栏目:百科 来源:网络整理
导读:我正在编写一个连续的轮询循环来监视某些事件发生,然后在UI线程上采取一些操作. 我正在编写以下代码 public static void HandlePopup(this HostedControl control,string className,string caption,System.Action callback) { var popupTask = Task.Factory.
我正在编写一个连续的轮询循环来监视某些事件发生,然后在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);
        },TaskContinuationOptions.None,TaskScheduler.FromCurrentSynchronizationContext()).ContinueWith((prevTask) =>
        {
            if (!prevTask.IsFaulted)
            {
                if (control.InvokeRequired)
                {
                    control.Invoke(callback);
                }
                else 
                {
                    callback();
                }
            }
        },TaskScheduler.FromCurrentSynchronizationContext());

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

do while循环现在没有任何代码,因为我想测试一下,如果我无限地运行一个循环,UI不会阻塞,但是,它没有按预期工作,当代码运行这个循环时(永远不会返回) UI冻结并变得无响应,直到我打破了运行.

我该怎么做才能让它在后台默默运行

注意:调用此方法的父级是Web浏览器controlsdocumentcompelte`事件. Web浏览器控件位于Windows窗体应用程序中.

解决方法

您通过指定明确告知继续在当前同步上下文中运行
TaskScheduler.FromCurrentSynchronizationContext()

所以,是的,这将阻止UI线程,因为它在UI线程中运行,假设在UI线程中调用此整体方法.原始任务将在后台运行,但您的延续都计划在UI线程中运行.如果您不想这样做,请不要使用该任务计划程序.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读