没有框架功能的C#异步

时间:2012-11-13 11:07:31

标签: c# asynchronous

我有一个使用不同参数运行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不使用任何提供异步的框架函数;它是完全同步的。

用不同的词来形容它:我想要使用新的async / await关键字异步/同时运行此方法的n个任务。

2 个答案:

答案 0 :(得分: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更清楚。

答案 1 :(得分:1)

让它成为一个返回任务的函数。

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

SomeMethodAsync现在是awaitable