c# - 如何使用线程模拟 Task.Wait

标签 c# c#-4.0

我想模拟这段代码:

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/

相关文章:

c# - 在构建系统已引用 System.Core 时添加对它的引用

c# - Realm 数据库异步查询和.Net

javascript - 使用 websocket 时的奇怪行为

wpf - 无法让 View 的可见性接受来自其绑定(bind)的值

c# - 将匿名类型作为强类型返回

c# - 蕴涵运算反射(reflect)了什么?

C# 合并两个排序列表(联合?)

c# - 根据以前的 XML 组合框选择填充组合框

c# - 在 C#.net 中将自定义按钮添加到 gridview

c# - 在 C# 中检查硬盘是否为 SSD 而不在硬盘上写入任何文件的最简单方法是什么?