首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何实现异步操作委托方法?

如何实现异步操作委托方法?
EN

Stack Overflow用户
提问于 2013-12-17 10:09:04
回答 2查看 91.5K关注 0票数 158

一点背景信息。

我正在学习Web API堆栈,并尝试将所有数据封装为带有SuccessErrorCodes等参数的"Result“对象形式。

然而,不同的方法会产生不同的结果和错误代码,但结果对象通常会以相同的方式实例化。

为了节省一些时间,也为了更多地了解C#中的async/await功能,我试图将我的web API操作的所有方法体包装在一个异步操作委托中,但遇到了一些问题……

给定以下类的

代码语言:javascript
复制
public class Result
{
    public bool Success { get; set; }
    public List<int> ErrorCodes{ get; set; }
}

public async Task<Result> GetResultAsync()
{
    return await DoSomethingAsync<Result>(result =>
    {
        // Do something here
        result.Success = true;
        
        if (SomethingIsTrue)
        {
            result.ErrorCodes.Add(404);
            result.Success = false;
        }
    }
}

我想编写一个在Result对象上执行操作并返回它的方法。通常,通过同步方法,它将是

代码语言:javascript
复制
public T DoSomethingAsync<T>(Action<T> resultBody) where T : Result, new()
{
    T result = new T();
    resultBody(result);
    return result;
}

但是,如何使用async/await将此方法转换为异步方法呢

这是我尝试过的:

代码语言:javascript
复制
public async Task<T> DoSomethingAsync<T>(Action<T, Task> resultBody) 
    where T: Result, new()
{
    // But I don't know what do do from here.
    // What do I await?
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-12-17 11:11:04

Action<T>async等价物是Func<T, Task>,所以我相信这就是您要找的:

代码语言:javascript
复制
public async Task<T> DoSomethingAsync<T>(Func<T, Task> resultBody)
    where T : Result, new()
{
  T result = new T();
  await resultBody(result);
  return result;
}
票数 353
EN

Stack Overflow用户

发布于 2013-12-17 10:32:17

因此,我认为实现这一点的方法是:

代码语言:javascript
复制
public Task<T> DoSomethingAsync<T>(Action<T> resultBody) where T : Result, new()
{
    return Task<T>.Factory.StartNew(() =>
    {
        T result = new T();
        resultBody(result);
        return result;
    });
}
票数 -15
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20624667

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档