C# 将TaskCompletionSource转换为Task.FromResult<;TResult>;?
我有一个异步启动方法的简单代码。它使用C# 将TaskCompletionSource转换为Task.FromResult<;TResult>;?,c#,multithreading,task-parallel-library,.net-4.5,C#,Multithreading,Task Parallel Library,.net 4.5,我有一个异步启动方法的简单代码。它使用TCS将代码包装为任务 Task<int> DoWork() { var source = new TaskCompletionSource <int>(); Thread.Sleep(220); source.SetResult(9999999); return source.Task; } void Main() { Console.WriteLine(1); var t1=Ta
TCS
将代码包装为任务
Task<int> DoWork()
{
var source = new TaskCompletionSource <int>();
Thread.Sleep(220);
source.SetResult(9999999);
return source.Task;
}
void Main()
{
Console.WriteLine(1);
var t1=Task.Factory.StartNew(()=>DoWork());
t1.ContinueWith(_=>Console.WriteLine ("doing something different "));
t1.ContinueWith(_=>Console.WriteLine ("finished , value is ="+_.Result.Result));
Console.WriteLine(2);
Console.ReadLine();
}
但现在,我想将其转换为使用Task.FromResult
这就是,所以我想知道,如何将上面的代码转换为使用
Task.FroResult
?使用fromsult
最简单的方法是:
public Task<int> DoWork()
{
return Task.FromResult(99999);
}
public Task DoWork()
{
返回任务.FromResult(99999);
}
但这完全等同于做:
var tcs = new TaskCompletionSource<int>();
tcs.SetResult(99999);
return tcs.Task;
var tcs=new TaskCompletionSource();
tcs.SetResult(99999);
返回tcs.Task;
所以它在220毫秒内不睡觉。对于“延迟”变体,最简单的方法是:
public async Task<int> DoWork()
{
await Task.Delay(220);
return 99999;
}
public异步任务DoWork()
{
等待任务。延迟(220);
返回99999;
}
此版本的行为与您提供的示例非常接近。在您的代码中,只有在同步等待结束后才返回
任务,因此您的代码相当于:
Task<int> DoWork()
{
Thread.Sleep(220);
return Task.FromResult(9999999);
}
(注意:我并不是说你应该用真正的代码来做这件事。)
任务无法模拟此代码。FromResult()
,因为它总是创建一个已完成的任务
,实际上它与我的示例不同。Myne由于睡眠而在某个地方有一个被阻塞的线程,而您的线程从任务开始就没有被阻塞。延迟使用的计时器不可用blocking@RoyiNamir没错,这是异步等待,而不是阻塞等待,但由于您现在正在使用async&wait,tumb的一般规则是您不应该同步等待。除非你想花时间解决死锁:)@PatrykĆwiek是的,但这并不意味着你应该说is的行为完全相同。@svick Right,你在技术上是正确的(最好的一种正确)。我做了一个小编辑来反映这一点。:)
Task<int> DoWork()
{
Thread.Sleep(220);
return Task.FromResult(9999999);
}
Task<int> DoWork()
{
var source = new TaskCompletionSource<int>();
Task.Run(() =>
{
Thread.Sleep(220);
source.SetResult(9999999);
});
return source.Task;
}