首页 > 解决方案 > 推迟任务的开始

问题描述

我有一系列返回任务的方法(参数数量可变)我想通过传递任务来创建一个在每个方法之前和之后执行某些操作的方法。我在这个示例中简化了所有内容(删除了 cancelToken、实际处理等):

public async Task<string> GetDataString()
{
    Console.WriteLine("Executing");
    return "test";
}


public async Task<T> Process<T>(Task<T> task)
{
    Console.WriteLine("Before");
    var res = await task;
    Console.WriteLine("After");
    return res;
}

而在我的主要:

Task<string> task = GetDataString();
string result = await Process<string>(tasks);
Console.WriteLine(res);

控制台输出是

Executing
Before
After
test

我可以做些什么来创建任务但实际上没有启动它?并且只在等待之前启动它?

我设法通过创建 PauseToken 来做到这一点,如本文所述: https ://devblogs.microsoft.com/pfxteam/cooperatively-pausing-async-methods/ 但我想知道是否有更好的方法。

谢谢, 马蒂亚

标签: c#.net-coreasync-awaittask-parallel-library

解决方案


您的通用ProcessAsync方法可以接受任务工厂作为参数:

public async Task<T> ProcessAsync<T>(Func<Task<T>> taskFactory)
{
    Console.WriteLine("Before");
    var res = await taskFactory();
    Console.WriteLine("After");
    return res;
}

这样,任务将在您调用工厂方法时创建。您可以控制它的创建。

这是调用该ProcessAsync方法的示例,将 lambda 作为工厂传递:

var result = await ProcessAsync(() => GetDataStringAsync(arg1, arg2));

这样,您就不会局限于没有参数的工厂方法。

为了完整起见,我应该提到Task对象也可以使用构造函数在冷状态下创建new Task(),然后使用该Start方法开始,但不建议使用这种方法。


推荐阅读