Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将TaskCompletionSource转换为Task.FromResult<;TResult>;?_C#_Multithreading_Task Parallel Library_.net 4.5 - Fatal编程技术网

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;
}