任务ContinueWith尽管UI上下文导致跨线程异常

我的印象是使用Task的ContinueWith方法与UI上下文允许在UI元素上执行操作而不会导致跨线程异常。但是,在运行以下代码时,我仍然遇到异常:任务ContinueWith尽管UI上下文导致跨线程异常

var context = TaskScheduler.FromCurrentSynchronizationContext(); 

Task<SomeResultClass>.Factory.StartNew(SomeWorkMethod).ContinueWith((t) =>

{

myListControl.Add(t.Result); // <-- this causes an exception

}, context);

任何想法?

回答:

交叉线程异常有两种不同的原因。

最常见的一种情况是您尝试从非UI线程修改控件的状态。这是而不是您遇到的问题。

你打的那个是控件必须在UI线程上创建。你的任务是在不同的线程上创建控件,当你试图将这个控件添加到在UI线程上创建的控件时,你会得到异常。

您需要从控件创建中分离出工作来完成此工作。尝试返回Func<Control>而不是Control,并在添加之前在UI线程上调用它。保持大部分工作在任务线程上,但是通过返回刚创建控件的Func<>来形成一个很好的紧密关闭。

var context = TaskScheduler.FromCurrentSynchronizationContext(); 

Task<SomeResultClass>.Factory.StartNew(SomeWorkMethod).ContinueWith((t) =>

{

if (!myListControl.InvokeRequired)

myListControl.Add(t.Result); // <-- this causes an exception

else

myListControl.Invoke((Action)(() => myListControl.Add(t.Result)));

}, context);

(假设这是的WinForms)

如果你想铁道部控制重构的加入到一个方法:

回答:

从原因和可能的解决方案Enigmativity告诉媒体链接,你可以八方通做这样的事情

除了并使用InvokeRequired方法中调用自身的调用里面,如果需要:

private void AddToListControl(MyItem item) 

{

if (myListControl.InvokeRequired)

{

myListControl.Invoke((Action)(() => AddToListControl(item)));

return;

}

myListControl.Add(item);

}

什么Enigmativity在暗示是someth荷兰国际集团这样的:

var result = 

Task<Action>.Factory.StartNew(SomeWorkMethod).ContinueWith((t) =>

{

return() => myListControl.Add(t.Result);

});

result.Result();

但恕我直言,这只是你从一开始就得到了,因为你必须再次调用结果,操作正确的线程在同一个地方。

以上是 任务ContinueWith尽管UI上下文导致跨线程异常 的全部内容, 来源链接: utcz.com/qa/263853.html

回到顶部