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

前端之家收集整理的这篇文章主要介绍了c# – 任务继续阻止UI线程前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在编写一个连续的轮询循环来监视某些事件发生,然后在UI线程上采取一些操作.

我正在编写以下代码

  1. public static void HandlePopup(this HostedControl control,string className,string caption,System.Action callback)
  2. {
  3. var popupTask = Task.Factory.StartNew(() =>
  4. {
  5. Thread.Sleep(5000); // just wait for 5 seconds.
  6. },CancellationToken.None,TaskCreationOptions.None,TaskScheduler.Default).ContinueWith((prevTask) =>
  7. {
  8. AutomationElementCollection collection = null;
  9. do
  10. {
  11.  
  12. } while (true);
  13. },TaskContinuationOptions.None,TaskScheduler.FromCurrentSynchronizationContext()).ContinueWith((prevTask) =>
  14. {
  15. if (!prevTask.IsFaulted)
  16. {
  17. if (control.Invokerequired)
  18. {
  19. control.Invoke(callback);
  20. }
  21. else
  22. {
  23. callback();
  24. }
  25. }
  26. },TaskScheduler.FromCurrentSynchronizationContext());
  27.  
  28. try
  29. {
  30. ////popupTask.Wait();
  31. }
  32. catch (AggregateException ex)
  33. {
  34. ex.Handle(exnew =>
  35. {
  36. return true;
  37. });
  38. }
  39. }

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

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

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

解决方法

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

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

猜你在找的C#相关文章