gpt4 book ai didi

c# - 任务继续阻塞 UI 线程

转载 作者:太空狗 更新时间:2023-10-29 20:58:43 29 4
gpt4 key购买 nike

我正在编写一个连续的轮询循环来观察一些事件的发生,然后在 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 浏览器控件sdocumentcompelte` 事件。 Web 浏览器控件位于 Windows 窗体应用程序中。

最佳答案

您通过指定

明确地告诉继续在当前同步上下文中运行
TaskScheduler.FromCurrentSynchronizationContext()

是的,这会阻塞 UI 线程,因为它在 UI 线程中运行,假设在 UI 线程中调用了整个方法。原始任务将在后台运行,但您的延续任务都安排在 UI 线程中运行。如果您不想这样做,请不要使用该任务计划程序。

关于c# - 任务继续阻塞 UI 线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20629149/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com