Task.Run
Task.Run(() => Do()); //无类型参数
Task.Run<string>(() => "hello"); //有类型参数
async/await
await 的对象是 Task
- 用法1
private static Task<string> GetData()
{
return new Task<string>(() =>
{
Thread.Sleep(2000);
return "hello";
});
}
public static async Task<string> GetDataAsync()
{
var t = GetData();
t.Start();
var data = await t;
return data;
}
这种方法要手动启动Task不推荐。
- 用法 2(推荐)
private static async Task<string> GetData()
{
await Task.Delay(2000);
return "hello";
}
public static async Task<string> GetDataAsync()
{
var data = await GetData();
return data;
}
但是这种方式给 GetData方法用上了 async关键字,如果不想用 async 关键字怎么办?可以用TaskCompletionSource。
- 用法 3(推荐)
private static Task<string> GetData(int condition)
{
var tcs = new TaskCompletionSource<string>();
//模拟耗时任务
Task.Run(() =>
{
try
{
Thread.Sleep(2000);
if (condition == 1)
{
tcs.SetResult("hello");
}
else if (condition == 2)
{
tcs.SetCanceled();
}
}
catch (Exception e)
{
tcs.SetException(e);
Console.WriteLine(e);
}
});
return tcs.Task;
}
public static async Task<string> GetDataAsync()
{
//这里会等待,直到 TaskCompletionSource 被 SetResult / SetCanceled / SetException
var data = await GetData(1);
return data;
}
9610

被折叠的 条评论
为什么被折叠?



