包装任务以返回值

时间:2017-05-28 20:13:23

标签: c# async-await

我觉得有更好的方法来做以下事情并寻找其他意见。

本质上,我正在尝试使用async / await模式,但需要从方法返回一个bool值来指示方法中发生的事情,这导致我用Task包装Task,这样就可以完成。我的蜘蛛侠意识告诉我,我的实施有问题。

在下面的例子中,“LongRunningTask”是我无法控制的东西,因为它是一个返回Task的库方法,所以我无法改变。可以改变流逻辑的其余部分。显然,这只是我真实问题的虚构表示,但意味着要证明这个问题,所以不要陷入硬编码的“GetData”等......

看一看,让我知道其他选项。

void Main()
{
    StartApplication();
}

private async void StartApplication()
{
    // This is a just fictional example passing hard-coded GetData
    var didExecuteLongRunningTask = await ProcessStuff("GetData");

    if (didExecuteLongRunningTask)
    {
        Console.WriteLine("Long running task was executed");
    }
    else {
        Console.WriteLine("Long running task was NOT executed");
    }
}

// Define other methods and classes here
private async Task<bool> ProcessStuff(string command)
{
    if (command == "GetData")
    {
        await LongRunningTask();
        return await Task<bool>.Factory.StartNew(() => true);
    }
    else
    {
        return await Task<bool>.Factory.StartNew(() => false);
    }
}

private Task LongRunningTask()
{
    return Task.Delay(2000);
}

1 个答案:

答案 0 :(得分:2)

是的,你是对的,你过于复杂了。你可以这样做:

private async Task<bool> ProcessStuff(string command)
{
    if (command == "GetData")
    {
        await LongRunningTask();
        return true;
    }
    else
    {
        return false;
    }
}

您可以查看MSDN以获取更多信息:Asynchronous Programming