如何从internet下载资源并在c#(winforms)中立即报告(同时执行最大并发任务)

如何从internet下载资源并在c#(winforms)中立即报告(同时执行最大并发任务),c#,winforms,async-await,task-parallel-library,webclient,C#,Winforms,Async Await,Task Parallel Library,Webclient,我正在制作一个应用程序,以windows窗体显示从web收集的一些数据,今天我必须按顺序下载所有数据,然后才能显示它们,如何在有限的队列中并行执行(执行最大并发任务),以显示下载时刷新datagridview的结果 我今天学到的是一种方法 internal async Task<string> RequestDataAsync(string uri) { var wb = new System.Net.WebClient(); //

我正在制作一个应用程序,以windows窗体显示从web收集的一些数据,今天我必须按顺序下载所有数据,然后才能显示它们,如何在有限的队列中并行执行(执行最大并发任务),以显示下载时刷新datagridview的结果

我今天学到的是一种方法

    internal async Task<string> RequestDataAsync(string uri)
    {
        var wb = new System.Net.WebClient(); //                 
        var sourceAsync = wb.DownloadStringTaskAsync(uri);
        string data = await sourceAsync;
        return data;
    }
内部异步任务RequestDataAsync(字符串uri)
{
var wb=new System.Net.WebClient();//
var sourceAsync=wb.downloadstringtaskaync(uri);
字符串数据=等待sourceAsync;
返回数据;
}
我放在一个foreach()上,在它结束后,将数据解析为自定义对象列表,然后将该对象转换为DataTable,并将datagridview绑定到该表

我不确定是否最好的方法是使用示例中的LimitedConcurrencyLevel TaskScheduler(我不确定如何在每次资源宕机时向网格报告),或者是否有最好的方法来做到这一点

我不喜欢同时启动所有任务,因为有时我必须同时请求100个downlads,我喜欢在同一时间最多执行10个任务

我知道这是一个涉及到控制并发任务并在下载时报告的问题,但不确定现在最好的方法是什么。

我不经常推荐,但我认为这会对您有所帮助

并发异步是通过
任务完成的。当所有的
(我书中的配方2.4):

要在数据到达时处理数据,请介绍另一种
async
方法(我书中的配方2.6):

列出URI=。。。;
var信号量=新信号量lim(10);
var tasks=uris.Select(异步uri=>
{
wait semaphore.WaitAsync();
请尝试{await RequestAndProcessDataAsync(uri);}
最后{semaphore.Release();}
});
等待任务。何时(任务);
异步任务RequestAndProcessDataAsync(字符串uri)
{
var data=await-RequestDataAsync(uri);
var myObject=Parse(数据);
_添加(myObject);
}
我不经常推荐,但我认为它会对您有所帮助

并发异步是通过
任务完成的。当所有的
(我书中的配方2.4):

要在数据到达时处理数据,请介绍另一种
async
方法(我书中的配方2.6):

列出URI=。。。;
var信号量=新信号量lim(10);
var tasks=uris.Select(异步uri=>
{
wait semaphore.WaitAsync();
请尝试{await RequestAndProcessDataAsync(uri);}
最后{semaphore.Release();}
});
等待任务。何时(任务);
异步任务RequestAndProcessDataAsync(字符串uri)
{
var data=await-RequestDataAsync(uri);
var myObject=Parse(数据);
_添加(myObject);
}

非常感谢你,我最近两天真的在读关于线程、并发、异步/等待的书,但仍然无法正确地粘合所有部分,我会让你的书更好地理解正在发生的事情,现在我必须测试这段代码,看看它是否起作用:)谢谢你更快的回答,非常感谢你,在过去的两天里,我真的在阅读关于线程、并发、异步/等待的内容,但仍然无法正确地粘合所有部分,我会让你的书更好地理解正在发生的事情,现在我必须测试这段代码,看看这是否能起到作用:)谢谢你更快的回答,谢谢你
List<string> uris = ...;
var tasks = uris.Select(uri => RequestDataAsync(uri));
string[] results = await Task.WhenAll(tasks);
List<string> uris = ...;
var semaphore = new SemaphoreSlim(10);
var tasks = uris.Select(async uri =>
{
  await semaphore.WaitAsync();
  try { await RequestDataAsync(uri); }
  finally { semaphore.Release(); }
});
string[] results = await Task.WhenAll(tasks);
List<string> uris = ...;
var semaphore = new SemaphoreSlim(10);
var tasks = uris.Select(async uri =>
{
  await semaphore.WaitAsync();
  try { await RequestAndProcessDataAsync(uri); }
  finally { semaphore.Release(); }
});
await Task.WhenAll(tasks);

async Task RequestAndProcessDataAsync(string uri)
{
  var data = await RequestDataAsync(uri);
  var myObject = Parse(data);
  _listBoundToDataTable.Add(myObject);
}