推迟开始任务

问题描述 投票:2回答:1

我有一系列方法(具有可变数量的参数)可返回任务我想通过传递Task创建一个在每个方法之前和之后执行某些操作的方法。我已经简化了此示例中的所有内容(删除了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/但我想知道是否有更好的方法。

谢谢,Mattia

c# .net-core async-await task-parallel-library
1个回答
1
投票

您的通用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 Process(() => GetDataStringAsync(arg1, arg2));

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

为了完整起见,我还可以使用构造函数Task在冷状态下创建new Task()对象,然后在以后使用Start方法启动该对象,但不建议使用此方法。

© www.soinside.com 2019 - 2024. All rights reserved.