我是新来的asynchronous编程,所以经过一些asynchronous示例代码,我想写一个简单的asynchronous代码 我创build了一个简单的Winform应用程序,并在表单中写下了以下代码。 但它只是不工作 private Task<string> methodAsync() { Thread.Sleep(10000); return "Hello"; //Error: Cannot implicitly convert type 'string' to 'System.Threading.Tasks.Task<string>' } private async void button1_Click(object sender, EventArgs e) { string s = await methodAsync(); MessageBox.Show(s); } 有人可以在这里放一些灯光..
我有一些简单的代码作为repro: var taskTest = Task.Factory.StartNew(() => { System.Threading.Thread.Sleep(5000); }).ContinueWith((Task t) => { Console.WriteLine("ERR"); }, TaskContinuationOptions.OnlyOnFaulted); try { Task.WaitAll(taskTest); } catch (AggregateException ex) { foreach (var e in ex.InnerExceptions) Console.WriteLine(e.Message + Environment.NewLine + e.StackTrace); } 但是,我得到一个意外的TaskCanceledException被抛出在try catch块(它在AggregateException InnerExceptions对象)。 “任务被取消了”。 为什么我得到这个exception? 任务的延续永远不会触发,没有任何exception产生,但我仍然在等待时得到聚合exception…. 我希望有人可以解释这对我有意义:)
我有以下testing代码: void Button_Click(object sender, RoutedEventArgs e) { var source = new CancellationTokenSource(); var tsk1 = new Task(() => Thread1(source.Token), source.Token); var tsk2 = new Task(() => Thread2(source.Token), source.Token); tsk1.Start(); tsk2.Start(); source.Cancel(); try { Task.WaitAll(new[] {tsk1, tsk2}); } catch (Exception ex) { // here exception is caught } } void Thread1(CancellationToken token) { Thread.Sleep(2000); // If […]
我想await BlockingCollection<T>.Take()asynchronous,所以我不阻塞线程。 寻找像这样的东西: var item = await blockingCollection.TakeAsync(); 我知道我可以这样做: var item = await Task.Run(() => blockingCollection.Take()); 但是这有点杀死了整个想法,因为ThreadPool另一个线程被阻塞了。 有没有其他的select?
我想同时处理一个集合,但是我在执行时遇到了麻烦,所以我希望得到一些帮助。 如果我想在并行循环的lambda中调用C#中标记为asynchronous的方法,则会出现问题。 例如: var bag = new ConcurrentBag<object>(); Parallel.ForEach(myCollection, async item => { // some pre stuff var response = await GetData(item); bag.Add(response); // some post stuff } var count = bag.Count; 问题发生在count为0时,因为所有创build的线程都只是后台线程,并且Parallel.ForEach调用不会等待完成。 如果我删除了async关键字,方法如下所示: var bag = new ConcurrentBag<object>(); Parallel.ForEach(myCollection, item => { // some pre stuff var responseTask = await GetData(item); responseTask.Wait(); var response […]
我试图反序列化从http://api.usa.gov/jobs/search.json?query=nursing+jobs使用.NET 4.0任务模式返回的JSON。 它返回这个JSON('加载JSON数据'@ http://jsonviewer.stack.hu/ )。 [ { "id": "usajobs:353400300", "position_title": "Nurse", "organization_name": "Indian Health Service", "rate_interval_code": "PA", "minimum": 42492, "maximum": 61171, "start_date": "2013-10-01", "end_date": "2014-09-30", "locations": [ "Gallup, NM" ], "url": "https://www.usajobs.gov/GetJob/ViewDetails/353400300" }, { "id": "usajobs:359509200", "position_title": "Nurse", "organization_name": "Indian Health Service", "rate_interval_code": "PA", "minimum": 42913, "maximum": 61775, "start_date": "2014-01-16", "end_date": "2014-12-31", "locations": [ "Gallup, […]
Teaser :伙计们,这个问题不是关于如何实施重试策略的。 这是关于正确完成TPL数据stream块。 这个问题主要是我以前的问题在ITargetBlock内重试策略的延续 。 这个问题的答案是@ svick利用TransformBlock (source)和TransformManyBlock (target)的智能解决scheme。 剩下的唯一问题就是以正确的方式完成这个块:等待所有的重试先完成,然后完成目标块。 这就是我最终的结果(这只是一个片段,不要太注意非线程安全的retries集): var retries = new HashSet<RetryingMessage<TInput>>(); TransformManyBlock<RetryableMessage<TInput>, TOutput> target = null; target = new TransformManyBlock<RetryableMessage<TInput>, TOutput>( async message => { try { var result = new[] { await transform(message.Data) }; retries.Remove(message); return result; } catch (Exception ex) { message.Exceptions.Add(ex); if (message.RetriesRemaining == 0) { if […]
考虑到这一点, Task task = new Task (async () =>{ await TaskEx.Delay(1000); }); task.Start(); task.Wait(); 调用task.Wait()不会等待任务完成,并立即执行下一行,但如果将asynchronouslambdaexpression式包装到方法调用中,则代码将按预期工作。 private static async Task AwaitableMethod() { await TaskEx.Delay(1000); } 然后(根据svick评论更新) await AwaitableMethod();
当有一个或两个任务,但是当我们有多个任务列出的时候会抛出一个错误“一个任务被取消”。 List<Task> allTasks = new List<Task>(); allTasks.Add(….); allTasks.Add(….); Task.WaitAll(allTasks.ToArray(), configuration.CancellationToken); private static Task<T> HttpClientSendAsync<T>(string url, object data, HttpMethod method, string contentType, CancellationToken token) { HttpRequestMessage httpRequestMessage = new HttpRequestMessage(method, url); HttpClient httpClient = new HttpClient(); httpClient.Timeout = new TimeSpan(Constants.TimeOut); if (data != null) { byte[] byteArray = Encoding.ASCII.GetBytes(Helper.ToJSON(data)); MemoryStream memoryStream = new MemoryStream(byteArray); httpRequestMessage.Content = […]
在metro应用程序中,我需要执行一些WCF调用。 有大量的电话要做,所以我需要做一个并行循环。 问题是并行循环在WCF调用全部完成之前退出。 你将如何重构这个按预期工作? var ids = new List<string>() { "1", "2", "3", "4", "5", "6", "7", "8", "9", "10" }; var customers = new System.Collections.Concurrent.BlockingCollection<Customer>(); Parallel.ForEach(ids, async i => { ICustomerRepo repo = new CustomerRepo(); var cust = await repo.GetCustomer(i); customers.Add(cust); }); foreach ( var customer in customers ) { Console.WriteLine(customer.ID); } Console.ReadKey();