sha*_*ank 6 c# multithreading task task-parallel-library
我正在编写一个连续的轮询循环来监视某些事件发生,然后在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;
});
}
}
Run Code Online (Sandbox Code Playgroud)
do while循环现在没有任何代码,因为我想测试一下,如果我无限地运行一个循环,UI不会阻塞,但是,它没有按预期工作,当代码运行这个循环时(永远不会返回) UI冻结并变得无响应,直到我打破了运行.
我该怎么做才能让它在后台默默运行
注意:调用此方法的父级是Web浏览器控件sdocumentcompelte`事件.Web浏览器控件位于Windows窗体应用程序中.
Jon*_*eet 15
您通过指定明确告知继续在当前同步上下文中运行
TaskScheduler.FromCurrentSynchronizationContext()
Run Code Online (Sandbox Code Playgroud)
所以,是的,这将阻止UI线程,因为它在UI线程中运行,假设在UI线程中调用此整体方法.原始任务将在后台运行,但您的延续都计划在UI线程中运行.如果您不想这样做,请不要使用该任务计划程序.
| 归档时间: |
|
| 查看次数: |
1011 次 |
| 最近记录: |