【发布时间】:2016-03-25 20:01:49
【问题描述】:
我正在尝试从创建任务的线程(不是 GUI 线程)执行 ContinueWith 中的 Func。我试过这段代码:
SynchronizationContext.SetSynchronizationContext(new SynchronizationContext());
var scheduler = TaskScheduler.Current.FromCurrentSynchronizationContext();
Console.WriteLine(System.Threading.Thread.CurrentThread.ManagedThreadId);
var t = Task.Factory.StartNew(() =>
{
Console.WriteLine(System.Threading.Thread.CurrentThread.ManagedThreadId);
})
.ContinueWith(
_ => Console.WriteLine(System.Threading.Thread.CurrentThread.ManagedThreadId),
// Specify where to execute the continuation
scheduler
);
t.Wait();
但是调用者线程和 .ContinueWith 线程不同。知道为什么吗? 我得到以下结果:
1 3 3
看起来传递调度程序会导致 ContinueWith 从正在执行实际任务的线程执行,我希望它从创建任务的线程执行,在本例中为 1。
谢谢
【问题讨论】:
-
你能解释一下为什么你想这样做吗?
-
如果你有一个当前的同步上下文,这段代码会在
t.Wait();死锁,因为等待不会处理发布的任务。
标签: c# multithreading asynchronous task-parallel-library