如何在 Task<int> 中返回值?

7

I've this code:

static void Main(string[] args)
{
    // start import process
    Task<int> task = StartImportProcess();
    task.Wait();
    // check result

    // process finished
    Console.ReadKey();
}

static async Task<int> StartImportProcess()
{
    int result = 0;
    result = await ImportCustomers();

    // some other async/await operations

    return result;
}

static Task<int> ImportCustomers()
{
    // some heavy operations

    Thread.Sleep(1000);

    return 1; // <<< what should I return?
}

使用 Taskasync/await。我想要将 int 作为任务的结果返回。应该返回哪个对象呢?return 1; 是行不通的。


10
return Task.FromResult(1) 的意思是返回一个已经完成并且结果为1的任务。关于 Task.FromResult 的更多信息请参考这里 - CodeNotFound
1个回答

22

您应该使用 Task.FromResult,而不要从 Task 使用 Thread.Sleep

static async Task<int> ImportCustomers()
{
    // some heavy operations

    await Task.Delay(1000);

    // Already awaited, so we can return the result as-is.
    return 1;

    // Or: if not already awaited anything,
    //     and also with non-async tasks, use:
    return Task.FromResult(1);
}

嗯。但是,Task.Delay(1000)会如何实现呢?可能是类似以下代码:public static Task Delay(int millisecondsDelay) { Thread.Sleep(millisecondsDelay); return Task.FromResult(1); } - markzzz
3
你从哪里得到那个胡言乱语的?实现完全不同:https://referencesource.microsoft.com/#mscorlib/system/threading/Tasks/Task.cs,5863。 - Patrick Hofman
1
事实是:我需要在该函数内执行重操作。不再使用await。如果你看到这个方法不是异步的,我该怎么做? - markzzz
@markzzz 然后按照我的答案建议,返回 Task.FromResult(1) - Patrick Hofman
2
@PatrickHofman - 我的想法是,OP只是为了模拟繁重的工作而放置了Thread.Sleep(1000); - Enigmativity
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接