2

我有一个使用不同参数运行 n 次的方法,简化:

foreach(var param in params)
    ValueList.Add(SomeMethod(param));

我想这样做:

foreach(var param in params)
    TaskList.Add(SomeMethodAsync(param));

foreach(var task in TaskList)
    ValueList.Add(await task);

async Task<SomeValue> SomeMethodAsync(SomeParam p)
{
     //What to do here
     //To make this call async
     return SomeMethod(p);
}

如何修改当前方法以应用异步功能?SomeMethod不使用任何提供异步的框架功能;它是完全同步的。

用不同的词来描述它:我希望这个方法的 n 个任务使用新的 async/await 关键字异步/同时运行。

4

2 回答 2

2

如果您的方法没有返回异步结果,那么使用 async/await 是没有意义的。

如果您只想并行运行您的方法,请使用Parallel.ForEach

Parallel.ForEach(params, param => ValueList.Add(SomeMethod(param)));

如果 SomeMethod 不使用任务,或者等待任何框架异步调用,那么它将在单个线程上运行,无论您是否将异步添加到方法定义中。

在这种情况下,您最好的选择是在任务中运行 SomeMethod 。

async Task<SomeValue> SomeMethodAsync(SomeParam p)
{
    return await Task.Run<SomeValue>(() => SomeMethod(p));
}

我个人认为 Parallel.ForEach 更清晰。

于 2012-11-13T11:22:36.970 回答
1

只需将其设为函数返回任务即可。

Task<SomeValue> SomeMethodAsync(SomePAram p)
{
    return Task<SomeValue>.Run(()=> SomeMethod());
}

SomeMethodAsync现在是awaitable

于 2012-11-13T11:54:40.297 回答