c# - 推迟任务的启动<T>

标签 c# .net-core async-await task-parallel-library

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

关于c# - 推迟任务的启动<T>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59102594/

相关文章:

c# - 如何在 foreach 循环中的每次迭代后进行延迟?

c# - XSL 问题 XSL 选择特定字段名称

c# - 如何使用 C# 从 GridView_RowDeleting 事件中的 GridView 获取 ID?

java - 从 .Net Core 使用 JAR

.net-core - .net core 2.1 无法在 startup.cs 中引用 automapper

async-await - 为什么这个 xunit 测试死锁(在单个 CPU 虚拟机上)?

python asyncio解释和信号处理程序

C#:对象的 == 和 != 运算符的默认实现

c# - 为什么新线程可以访问UI?

.net - 从构建或发布管道在 azure devops 中发布 nuget 包