gpt4 book ai didi

c# - Control.Invoke 与带有 TaskScheduler 的任务

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

我找遍了,找不到答案。使用它是更好、更坏还是无关紧要:

{
...
RefreshPaintDelegate PaintDelegate = new RefreshPaintDelegate(RefreshPaint);
Control.Invoke(PaintDelegate);
}

protected void RefreshPaint()
{
this.Refresh();
}

……或者……

Task.Factory.StartNew(() =>
{
this.Refresh();
},
CancellationToken.None,
TaskCreationOptions.None,
uiScheduler);

最佳答案

假设 uiScheduler 是一个将调用委托(delegate)给 UI 线程的调度程序,我会说在功能上,使用两者是无关紧要的(除了对 Control.Invoke 的调用将阻塞直到调用完成,而对 Task 的调用不会,但是,您始终可以使用 Control.BeginInvoke 使它们在语义上等效)。

从语义的角度来看,我认为使用 Control.Invoke(PaintDelegate) 是一种更好的方法;当使用 Task 时,您正在隐式声明您要执行一个工作单元,通常,该工作单元具有与其他工作单元一起被调度的上下文,它是调度程序确定如何委托(delegate)工作(通常,它是多线程的,但在这种情况下,它被编码到 UI 线程)。还应该说的是,uiScheduler 和链接到 UI 线程的 Control 之间没有明确的链接,调用应该是一个(通常,它们是都一样,但有可能有多个 UI 线程,尽管这种情况很少见)。

但是,在使用 Control.Invoke 时,您想要做的事情的意图很明确,您想要编码对 Control 的 UI 线程的调用发送消息,这个调用完美地表明了这一点。

不过,我认为最好的选择是使用 SynchronizationContext实例;它抽象出一个事实,即您需要同步对该上下文的调用,而不是其他两个选项,这两个选项要么对调用 (Task) 的意图不明确,要么在调用方式上非常具体正在完成(Control.Invoke)。

关于c# - Control.Invoke 与带有 TaskScheduler 的任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5818296/

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