相关的这个答案 , 如果我确实想要“消除并忘记”一个返回任务的方法,并且(为了简单起见),让我们假设该方法不会抛出任何exception。 我可以使用答案中列出的扩展方法: public static void Forget(this Task task) { } 使用这种方法,如果Task存在导致抛出exception的错误,那么当抛出exceptionexception时,exception将被吞下并且不被注意。 问题:在这种情况下,扩展方法的forms不是更合适吗? public static async void Forget(this Task task) { await task; } 所以编程错误会引发exception并升级(通常会导致进程中断)。 在预期(和可忽略)exception的方法中,这个方法需要变得更精细(作为一个旁白,关于如何构build一个可以接受和可忽略的exceptiontypes列表的方法的任何build议? )
我正在使用完全asynchronous的API客户端,即每个操作都返回Task或Task<T> ,例如: static async Task DoSomething(int siteId, int postId, IBlogClient client) { await client.DeletePost(siteId, postId); // call API client Console.WriteLine("Deleted post {0}.", siteId); } 使用C#5 async / await运算符,启动多个任务并等待它们全部完成的正确/最有效的方法是: int[] ids = new[] { 1, 2, 3, 4, 5 }; Parallel.ForEach(ids, i => DoSomething(1, i, blogClient).Wait()); 要么: int[] ids = new[] { 1, 2, 3, 4, […]
我想运行一堆asynchronous任务,限制在任何给定时间有多less任务可能正在等待完成。 假设您有1000个url,并且您只希望一次打开50个请求; 但只要一个请求完成,您就可以打开到列表中下一个URL的连接。 那样的话,一次只能打开50个连接,直到URL列表被耗尽。 如果可能的话,我也想利用给定数量的线程。 我想出了一个扩展方法, ThrottleTasksAsync ,做我想要的。 那里有一个更简单的解决scheme吗? 我会假设这是一个常见的情况。 用法: class Program { static void Main(string[] args) { Enumerable.Range(1, 10).ThrottleTasksAsync(5, 2, async i => { Console.WriteLine(i); return i; }).Wait(); Console.WriteLine("Press a key to exit…"); Console.ReadKey(true); } } 这里是代码: static class IEnumerableExtensions { public static async Task<Result_T[]> ThrottleTasksAsync<Enumerable_T, Result_T>(this IEnumerable<Enumerable_T> enumerable, int maxConcurrentTasks, int maxDegreeOfParallelism, […]
我可能会失去一些东西,但做什么之间的区别: public void MyMethod() { Task t = Task.Factory.StartNew(DoSomethingThatTakesTime); t.Wait(); UpdateLabelToSayItsComplete(); } public async void MyMethod() { var result = Task.Factory.StartNew(DoSomethingThatTakesTime); await result; UpdateLabelToSayItsComplete(); } private void DoSomethingThatTakesTime() { Thread.Sleep(10000); }
// 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个网页被下载。 如何以最有效的方式做到这一点?
在任务返回asynchronous方法结束时,如果我调用另一个asynchronous方法,我可以await它或return它的任务。 每个人的后果是什么? Task FooAsync() { return BazAsync(); // Option A } async Task BarAsync() { await BazAsync(); // Option B }
TL; DR: 由StaTaskScheduler运行的任务内的死锁。 长版本: 我使用Parallel Team的ParallelExtensionsExtras中的StaTaskScheduler来托pipe由第三方提供的一些传统的STA COM对象。 StaTaskScheduler实现细节的描述如下: 好消息是TPL的实现能够在MTA或者STA线程上运行,并且考虑到WaitHandle.WaitAll(当方法提供了多个等待句柄时只支持MTA线程)等底层API的相关差异。 我认为这意味着TPL的阻塞部分将使用一个等待API的消息,如CoWaitForMultipleHandles ,以避免在STA线程上调用死锁情况。 在我的情况下,我相信以下情况正在发生:进程内的STA COM对象A调用了对象之外的对象B,然后期望从B通过作为传出呼叫的一部分的callback。 简化forms: var result = await Task.Factory.StartNew(() => { // in-proc object A var a = new A(); // out-of-proc object B var b = new B(); // A calls B and B calls back A during the Method call return a.Method(b); }, […]
以下两段代码之间有什么概念上的区别: async Task TestAsync() { await Task.Run(() => DoSomeWork()); } 和 Task TestAsync() { return Task.Run(() => DoSomeWork()); } 生成的代码是否有所不同? 编辑:为了避免与Task.Run混淆类似的情况: async Task TestAsync() { await Task.Delay(1000); } 和 Task TestAsync() { return Task.Delay(1000); } 最新更新:除了接受的答案之外, LocalCallContext的处理方式也有所不同: CallContext.LogicalGetData即使在没有asynchronous的情况下也会被恢复。 为什么?
有没有这样写的方法: public async Task<SomeResult> DoSomethingAsync() { // Some synchronous code might or might not be here… // return await DoAnotherThingAsync(); } 而不是这个: public Task<SomeResult> DoSomethingAsync() { // Some synchronous code might or might not be here… // return DoAnotherThingAsync(); } 会有道理吗? 为什么使用return await构造函数可以直接从内部的DoAnotherThingAsync()调用中返回Task<T> ? 我看到在这么多地方有return await代码,我想我应该错过了一些东西。 但据我所知,在这种情况下不使用async / await关键字,直接返回任务在function上是等价的。 为什么添加额外的await层的额外开销?
我有一个public async void Foo()方法,我想从同步方法调用。 到目前为止,我从MSDN文档中看到,通过asynchronous方法调用asynchronous方法,但是我的整个程序不是使用asynchronous方法构build的。 这甚至有可能吗? 下面是从asynchronous方法调用这些方法的一个示例: http : //msdn.microsoft.com/zh-cn/library/hh300224(v=vs.110).aspx 现在我正在调查从同步方法调用这些asynchronous方法。