所以我开始尝试理解异步,任务,lambda等等,我无法让它像我想的那样工作.使用下面的代码我希望它能锁定btnDoWebRequest,将未知数量的WebRequests作为任务执行,并且一旦完成所有任务,就解锁btnDoWebRequest.不过,我只想要3或任何数量最多我设置在同一时间运行的任务,这是我从获得的部分有一组任务的只有X同时运行.
但是在以多种方式尝试和修改我的代码之后,它将始终立即跳回并重新启用btnDoWebRequest.当然VS警告我需要等待,目前在".ContinueWith((任务)"和"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());
}));
}
Run Code Online (Sandbox Code Playgroud) c# multithreading asynchronous task-parallel-library async-await