我需要在控制台应用程序中运行多个asynchronous任务,并等待它们完成后再进一步处理。 那边有很多文章,但是我读得越多,似乎就越觉得困惑。 我已经阅读并理解了任务库的基本原理,但是我显然错过了某处的链接。 我明白,可以将任务链接起来,让他们在另一个完成后开始工作(这几乎是我读过的所有文章的场景),但是我希望所有的任务同时运行,而且我想知道一次他们都完成了。 这样的场景最简单的实现是什么?
// let's say there is a list of 1000+ URLs string[] urls = { "http://google.com", "http://yahoo.com", … }; // now let's send HTTP requests to each of these URLs in parallel urls.AsParallel().ForAll(async (url) => { var client = new HttpClient(); var html = await client.GetStringAsync(url); }); 这是问题,它启动1000多个并发的Web请求。 有没有简单的方法来限制这些asynchronousHTTP请求的并发量? 因此,在任何时候都不会有超过20个网页被下载。 如何以最有效的方式做到这一点?
有什么时候使用Task.Delay与Thread.Sleep的好规则? 具体来说,是否有一个最低的价值来提供一个是有效的/高效率的? 最后,由于Task.Delay在asynchronous/等待状态机上导致上下文切换,是否有使用它的开销?
使用Microsoft for .NET的async ctp,是否有可能捕获调用方法中的asynchronous方法引发的exception? public async void Foo() { var x = await DoSomethingAsync(); /* Handle the result, but sometimes an exception might be thrown For example, DoSomethingAsync get's data from the network and the data is invalid… a ProtocolException might be thrown */ } public void DoFoo() { try { Foo(); } catch (ProtocolException […]
下面的代码片段有什么区别? 不会都使用线程池线程? 例如,如果我想调用集合中的每个项目的函数, Parallel.ForEach<Item>(items, item => DoSomething(item)); vs foreach(var item in items) { Task.Factory.StartNew(() => DoSomething(item)); }
这段代码抛出一个exception。 有没有可能定义一个应用程序全局处理程序,将抓住它? string x = await DoSomethingAsync(); 使用.net 4.5 / WPF
我想等待一个Task <T>完成一些特殊的规则:如果X毫秒后还没有完成,我想向用户显示一条消息。 如果Y毫秒后还没有完成,我想自动请求取消 。 我可以使用Task.ContinueWithasynchronous等待任务完成(例如,计划任务完成时要执行的操作),但是不允许指定超时。 我可以使用Task.Wait同步等待任务完成超时,但是阻止我的线程。 我如何asynchronous地等待任务完成超时?
我不太了解Task.Wait和await之间的区别。 我有一些类似于ASP.NET WebAPI服务中的以下function: public class TestController : ApiController { public static async Task<string> Foo() { await Task.Delay(1).ConfigureAwait(false); return ""; } public async static Task<string> Bar() { return await Foo(); } public async static Task<string> Ros() { return await Bar(); } // GET api/test public IEnumerable<string> Get() { Task.WaitAll(Enumerable.Range(0, 10).Select(x => Ros()).ToArray()); return new string[] { […]
当你有服务器端代码(例如一些ApiController )和你的函数是异步的 – 所以它们返回Task<SomeObject> – 当你等待函数调用ConfigureAwait(false) ,是否认为是最佳做法? 我已经读过,它更高性能,因为它不必将线程上下文切换回原始线程上下文。 但是,对于ASP.NET Web Api,如果您的请求在一个线程中进入,并且您正在等待某个函数,并且在您返回ApiController函数的最终结果时调用ConfigureAwait(false) ,这可能会将您置于不同的线程中。 我已经打出了一个我在下面讨论的例子: public class CustomerController : ApiController { public async Task<Customer> Get(int id) { // you are on a particular thread here var customer = await SomeAsyncFunctionThatGetsCustomer(id).ConfigureAwait(false); // now you are on a different thread! will that cause problems? return customer; } }
在C#4.0中,我们在System.Threading.Tasks命名空间中有Task 。 Thread和Task之间真正的区别是什么? 我做了一些示例程序(来自MSDN的帮助)为我自己学习 Parallel.Invoke Parallel.For Parallel.ForEach 但是这个想法还不是很清楚,所以有很多疑问。 我最初在Stackoverflow中搜索类似的问题,但可能与这个问题标题我不能得到相同的。 如果有人知道前面发布的同类问题,请给出链接的参考。