将异步方法传递给其他类

时间:2018-08-06 13:19:52

标签: c# async-await delegates

我有一个如下所示的方法:

protected async Task<TModel> GetItemFromServerAsync(string id) { ... }

我想将此方法传递给另一个类并在那里执行它。 我尝试使用Func关键字,但调用以下方法时无法传递该方法:

public async Task<List<TModel>> Import(Func<string, Task<TModel>> getEntityFromDatabase)

如何在另一个类中调用GetItemFromServerAsync方法?

2 个答案:

答案 0 :(得分:0)

async本身不会更改界面,因此可以正常工作。这是一个示例:

void SendMyMethod()
{
    MyMethod2(MyMethod);
}

async Task<string> MyMethod(int a)
{
    return "5";
}

void MyMethod2(Func<int, Task<string>> func)
{
    func(5);
}

因此还有其他不起作用的地方。也许您应该发布代码和所收到的错误。

答案 1 :(得分:0)

此问题与async无关-我认为您的问题是Import不知道TModel是什么。

您尚未在任何地方指定TModel,但我假设它是在包含GetItemFromServerAsync的类中定义的

public class DataAccess<TModel>
{
    public async Task<TModel> GetItemFromServerAsync(string id)
    {
        return default(TModel); // just to make it compile, I assume you do some data access here or something
    }
}

然后在调用方,您需要指定TModel作为方法的一部分(但是您不必显式命名它,它将被推断出来):

async Task<List<TModel>> Import<TModel>(Func<string, Task<TModel>> getEntityFromDatabase)
{
    //...///
}

调用代码应遵循以下原则:

var da = new DataAccess<SomeType>();
var result = Import(da.GetItemFromServerAsync); // would be a list of "SomeType"

实时示例:http://rextester.com/OUUJG52678