我有一系列方法(具有可变数量的参数)可返回任务 我想通过传递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
答案 0 :(得分:6)
您的通用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
方法启动,但是不建议使用此方法。
答案 1 :(得分:-1)
您可以删除async关键字(从GetDataString中删除)并创建一个新任务,该任务将在您等待时执行
所以下面的代码结果是:before,execute,test,after
private static async Task Start()
{
Task<string> task = GetDataString();
string result = await Process<string>(task);
Console.WriteLine(result);
Console.ReadLine();
}
public Task<string> GetDataString()
{
return new TaskFactory(TaskScheduler.Default).StartNew(() =>
{
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;
}