如何在不运行Task的情况下将Action转换为Func <Task>?

西拉斯·雷纳格尔

我有完全可以按需工作的代码。但是,我们的公司构建服务器会拒绝任何包含编译器警告的签入。

由于没有使用await语句,因此针对Action构造函数(从Action到Func的转换)显示了以下警告(按预期)。

此异步方法缺少“等待”运算符,将同步运行。考虑使用“ await”运算符来等待非阻塞API调用,或者使用“ await Task.Run(...)”来在后台线程上执行CPU绑定的工作。

public class TransactionOperation
{
    private readonly Func<Task> _operation;
    private readonly Func<Task> _rollback;

    public OperationStatus Status { get; private set; }

    public TransactionOperation(Func<Task> operation, Func<Task> rollback)
    {
        _operation = operation;
        _rollback = rollback;
        Status = OperationStatus.NotStarted;
    }

    public TransactionOperation(Action operation, Action rollback)
    {
        _operation = async () => operation.Invoke();
        _rollback = async () => rollback.Invoke();
        Status = OperationStatus.NotStarted;
    }

    public async Task Invoke()
    {
        try
        {
            Status = OperationStatus.InProcess;
            await _operation.Invoke();
            Status = OperationStatus.Completed;
        }
        catch (Exception ex)
        {
            //...
        }
    }
}

什么是重写该代码的正确方法,以便将该Action正确转换为Func而不执行或创建新线程(即,等待Task.Run())?


更新-建议的答案1

_operation =()=>新Task(operation.Invoke);

_rollback =()=>新Task(rollback.Invoke);

我以前尝试过。它导致此单元测试永不返回。

[TestMethod, TestCategory("Unit Test")]
public async Task Transaction_MultiStepTransactionExceptionOnFourthAction_CorrectActionsRolledBack()
{
    var operation = new TransactionOperation(PerformAction, () => RollbackOperation(1));
    var operation2 = new TransactionOperation(PerformAction, () => RollbackOperation(2));
    var operation3 = new TransactionOperation(PerformAction, () => RollbackOperation(3));
    var operation4 = new TransactionOperation(ExceptionAction, () => RollbackOperation(4));
    var operation5 = new TransactionOperation(PerformAction, () => RollbackOperation(5));
    var transaction = new Transaction(new[] { operation, operation2, operation3, operation4, operation5 });

    await IgnoreExceptions(transaction.ExecuteAsync);

    AssertActionsPerformedThrough(4);
    AssertActionsRolledBackThrough(4);
}

更新-接受的答案

private async Task ConvertToTask(Action action)
{
    action.Invoke();
    await Task.FromResult(true);
}

这是更新的Action构造函数:

public TransactionOperation(Action operation, Action rollback)
{
    _operation = () => ConvertToTask(operation);
    _rollback = () => ConvertToTask(rollback);
    Status = OperationStatus.NotStarted;
}
斯蒂芬·克莱里

您可以使用Task.FromResult(0)

_operation = async () => { operation.Invoke(); await Task.FromResult(0); };

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在没有T的情况下将Task <T>强制转换为C#中的Task <object>

如何在不阻止主踏板的情况下将Thread.Sleep与Task.Run结合使用

如何在 C# 中将 IEnumerable<Task<T>> 转换为 IEnumerable<Func<Task<T>>>?

异步将Task <A>转换为Task <B>

如何将委托`Func<T1, Func<T2, Task<TResult>>>` 转换为`Func<T1, Task<Func<T2, TResult>>`?

从异步lambda动作转换为Func <Task>?

如何在不使用 Task.Delay 或 await 的情况下编写异步方法

从Task [Either [A,Task [B]]]转换为Task [Either [A,B]]

VB.Net Task结果自动转换为Task(of Task)

无法将类型'Task <Derived>'转换为'Task <Interface>'

将Task <object>转换为Task <T>,其中T未知

无法将Task <List <TEntity >>转换为Task <IList <TEntity >>

将Task Task集合转换为Value集合

如何从 Task<List<Derived>> 转换为 Task<List<Base>>

将Long转换为Task <long>

将Task <T>强制转换为T

如何将任务转换为Task <T>?

如何将Task <MyType>的序列转换为MyType的序列

在Android服务中如何在没有标志FLAG_ACTIVITY_NEW_TASK的情况下启动意图?

公共静态Task Run(Func <Task>函数);

在不等待的情况下否定Task <bool>?

Task的TaskCompletionSource

为什么通话不明确?'Task.Run(Action)'和'Task.Run(Func <Task>)'

在以下情况下如何将自定义对象与相应的Task映射?

在这种情况下我如何断行: Welhome: 'Welcome home\nNext task starts in',

错误:类型不兼容:Task <Uri>无法转换为Uri

如何生成要解包的Task <Task>

将lambda异步到Expression <Func <Task >>

异步lambda,并且无法将Task.Task.List <Object>隐式转换为List <Object>