我想模拟这段代码:
Task t = Task.Factory.StartNew(...)
t.Wait()
根据这个question任务无法设置公寓状态。可以使用线程设置单元状态,但我需要任务中的等待功能。有没有办法使用线程模拟 Wait() 函数?
最佳答案
Thread.Join
将阻塞当前线程,直到另一个线程完成。
哦,郑重声明,声明Tasks cannot set apartment state
是不正确的。或许 StartNew
永远不会创建代表 STA 线程中工作的任务,但某些其他方法可以创建代表 STA 中工作的Task
线。例如,这个:
public static Task<T> StartSTATask<T>(Func<T> func)
{
var tcs = new TaskCompletionSource<T>();
Thread thread = new Thread(() =>
{
try
{
tcs.SetResult(func());
}
catch (Exception e)
{
tcs.SetException(e);
}
});
thread.SetApartmentState(ApartmentState.STA);
thread.Start();
return tcs.Task;
}
(您可以为 Task
创建一个看起来几乎相同的,或者为 StartNew
具有的一些不同选项添加重载。)
关于c# - 如何使用线程模拟 Task.Wait,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16722569/