c# - 推迟任务的开始
问题描述
我有一系列返回任务的方法(参数数量可变)我想通过传递任务来创建一个在每个方法之前和之后执行某些操作的方法。我在这个示例中简化了所有内容(删除了 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/ 但我想知道是否有更好的方法。
谢谢, 马蒂亚
解决方案
您的通用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
方法开始,但不建议使用这种方法。
推荐阅读
- python - 修改时如何避免将“keras_learning_phase”添加到模型中?
- typescript - 嵌套抽屉导航器中抽屉内容的道具类型
- python - Django + React webApp中的掩码URL
- python - PLY 问题匹配所有找到的令牌
- eclipse - 在RCP/Plugin开发中,'activewhen'和'enabledwhen'中要写的properties、args和values应该写什么?
- mongodb - 如何获取分组结果的最新值?
- oracle - 如何解决 ORA-28000:帐户在 oracle 中被锁定
- python - 为什么要列出的熊猫数据框-0.999990变成-0.9999899999999999,谁能帮助我?
- swift - 删除数组元素时,SwiftUI 的 ForEach 崩溃
- php - 如何在整个 PHP 站点中更改图像位置