【发布时间】:2014-04-26 20:58:15
【问题描述】:
所以我刚开始尝试理解 async、Task、lambda 等,但我无法让它像我想要的那样工作。使用下面的代码,我希望它锁定 btnDoWebRequest,将未知数量的 WebRequest 作为任务执行,一旦所有任务完成,解锁 btnDoWebRequest。但是,我只希望一次运行最多 3 个或我设置的任何数量的任务,部分来自Have a set of Tasks with only X running at a time。
但在尝试并以多种方式修改我的代码后,它总是会立即跳回并重新启用 btnDoWebRequest。当然,VS警告我需要等待,目前在“.ContinueWith((task)”和“await Task.WhenAll(requestInfoList .Select(async i =>”)中的异步,但似乎无法在哪里工作或如何进行所需的等待。当然,由于我仍在学习,我很有可能在这一切上都做错了,整个事情都需要重新设计。所以任何帮助都将不胜感激。
谢谢
private SemaphoreSlim maxThread = new SemaphoreSlim(3);
private void btnDoWebRequest_Click(object sender, EventArgs e)
{
btnDoWebRequest.Enabled = false;
Task.Factory.StartNew(async () => await DoWebRequest()).Wait();
btnDoWebRequest.Enabled = true;
}
private async Task DoWebRequest()
{
List<requestInfo> requestInfoList = new List<requestInfo>();
for (int i = 0; dataRequestInfo.RowCount - 1 > i; i++)
{
requestInfoList.Add((requestInfo)dataRequestInfo.Rows[i].Tag);
}
await Task.WhenAll(requestInfoList .Select(async i =>
{
maxThread.Wait();
Task.Factory.StartNew(() =>
{
var task = Global.webRequestWork(i);
}, TaskCreationOptions.LongRunning).ContinueWith((task) => maxThread.Release());
}));
}
【问题讨论】:
-
编译器错误可能是因为您的事件处理程序没有 async 关键字?如果没有这个,我怀疑处理程序中的 await 关键字是否按预期工作,即等待长时间运行的操作完成。
-
而且,由于您的事件处理程序将阻塞,直到一切完成,您将切换服务器上按钮的启用状态,并且只有在您要调试代码时才会证明这一点。
标签: c# multithreading asynchronous async-await task-parallel-library