gpt4 book ai didi

c# - 从后台线程启动时,UI 线程上的任务继续

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

如果以下代码在后台线程上运行,我如何在主线程上“ContinueWith”?

  var task = Task.Factory.StartNew(() => Whatever());
task.ContinueWith(NeedThisMethodToBeOnUiThread), TaskScheduler.FromCurrentSynchronizationContext())

上面的不行,因为当前同步上下文已经是后台线程了。

最佳答案

您需要从 UI 线程获取对 TaskScheduler.FromCurrentSynchronizationContext() 的引用并将其传递给延续。

与此类似。 http://reedcopsey.com/2009/11/17/synchronizing-net-4-tasks-with-the-ui-thread/

private void Form1_Load(object sender, EventArgs e)
{
// This requires a label titled "label1" on the form...
// Get the UI thread's context
var context = TaskScheduler.FromCurrentSynchronizationContext();

this.label1.Text = "Starting task...";

// Start a task - this runs on the background thread...
Task task = Task.Factory.StartNew( () =>
{
// Do some fake work...
double j = 100;
Random rand = new Random();
for (int i = 0; i < 10000000; ++i)
{
j *= rand.NextDouble();
}

// It's possible to start a task directly on
// the UI thread, but not common...
var token = Task.Factory.CancellationToken;
Task.Factory.StartNew(() =>
{
this.label1.Text = "Task past first work section...";
}, token, TaskCreationOptions.None, context);

// Do a bit more work
Thread.Sleep(1000);
})
// More commonly, we'll continue a task with a new task on
// the UI thread, since this lets us update when our
// "work" completes.
.ContinueWith(_ => this.label1.Text = "Task Complete!", context);
}

关于c# - 从后台线程启动时,UI 线程上的任务继续,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10606283/

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