对于每个项目,我使用 await 调用一个方法。我将如何同时执行此操作?
Foreach item I call a method using await. How would I do this simultaneously instead?
我的应用程序中有以下方法
public async void Method()
{
bool updated = false;
foreach (Feed feed in Feeds)
{
if (await feed.Update())
{
updated = true; // At least one feed was updated
}
}
if (updated)
{
// Do Something
}
}
如您所见,方法 Update()
对列表中的每个项目都一个接一个地调用。相反,我想同时对所有项目调用它,并知道其中一个是否成功。
方法 Update()
在 class Feed
中找到
public async Task<bool> Update()
{
try
{
WebRequest wr = WebRequest.Create(URL);
wr.Timeout = 5000;
using (WebResponse response = await wr.GetResponseAsync())
{
XmlDocument feed = new XmlDocument();
feed.Load(response.GetResponseStream());
// Do Something
return true;
}
}
catch (WebException we)
{
return false;
}
}
编辑:
到目前为止,我一直在尝试使用带有和不带有 return 值的异步方法来解决这个问题。
public async void Update()
{
if (await UpdateFeeds())
{
// Do something
}
}
public async Task<bool> UpdateAllFeeds()
{
// Update all the feeds and return bool
}
然后我意识到我在 UpdateAllFeed()
中仍然会遇到同样的问题。如果我将 Feed 中的 Update()
更改为 async void 方法,它们可以同时 运行,但那样我就没有回调了。
我不知道如何 运行 多个异步方法并且只在它们全部完成时才回调。
创建 Task<bool>
的列表,然后使用 Task.WhenAll
List<Task<bool>> tasks = new List<Task<bool>>();
foreach (var feed in feeds)
{
tasks.Add(feed.Update());
}
await Task.WhenAll(tasks);
var updated = (from t in tasks where t.Result select t).Any();
public async void Method()
{
bool updated = false;
Parallel.ForEach(Feeds, feed =>
{
if (feed.Update())
updated = true; // At least one feed was updated
});
if (updated)
{
// Do Something
}
}
我的应用程序中有以下方法
public async void Method()
{
bool updated = false;
foreach (Feed feed in Feeds)
{
if (await feed.Update())
{
updated = true; // At least one feed was updated
}
}
if (updated)
{
// Do Something
}
}
如您所见,方法 Update()
对列表中的每个项目都一个接一个地调用。相反,我想同时对所有项目调用它,并知道其中一个是否成功。
方法 Update()
在 class Feed
public async Task<bool> Update()
{
try
{
WebRequest wr = WebRequest.Create(URL);
wr.Timeout = 5000;
using (WebResponse response = await wr.GetResponseAsync())
{
XmlDocument feed = new XmlDocument();
feed.Load(response.GetResponseStream());
// Do Something
return true;
}
}
catch (WebException we)
{
return false;
}
}
编辑:
到目前为止,我一直在尝试使用带有和不带有 return 值的异步方法来解决这个问题。
public async void Update()
{
if (await UpdateFeeds())
{
// Do something
}
}
public async Task<bool> UpdateAllFeeds()
{
// Update all the feeds and return bool
}
然后我意识到我在 UpdateAllFeed()
中仍然会遇到同样的问题。如果我将 Feed 中的 Update()
更改为 async void 方法,它们可以同时 运行,但那样我就没有回调了。
我不知道如何 运行 多个异步方法并且只在它们全部完成时才回调。
创建 Task<bool>
的列表,然后使用 Task.WhenAll
List<Task<bool>> tasks = new List<Task<bool>>();
foreach (var feed in feeds)
{
tasks.Add(feed.Update());
}
await Task.WhenAll(tasks);
var updated = (from t in tasks where t.Result select t).Any();
public async void Method()
{
bool updated = false;
Parallel.ForEach(Feeds, feed =>
{
if (feed.Update())
updated = true; // At least one feed was updated
});
if (updated)
{
// Do Something
}
}