Tag: c# 5.0

使用ASP.NET Web API,我的ExecutionContext没有流入异步操作

我很难理解ExecutionContext背后的机制。 从我在线阅读的内容来看,安全性(Thread Principal),文化等上下文相关的项目应该跨越执行工作单元的边界内的异步线程。 我遇到了非常令人困惑和潜在危险的错误。 我注意到我的线程的CurrentPrincipal在异步执行中丢失了。 以下是ASP.NET Web API方案的示例: 首先,让我们设置一个简单的Web API配置,其中包含两个委托处理程序以进行测试。 他们所做的只是写出调试信息并传递请求/响应,除了第一个“DummyHandler”,它设置线程的主体以及要在整个上下文中共享的数据(请求的相关ID)。 public static class WebApiConfig { public static void Register(HttpConfiguration config) { config.MessageHandlers.Add(new DummyHandler()); config.MessageHandlers.Add(new AnotherDummyHandler()); config.Routes.MapHttpRoute( name: “DefaultApi”, routeTemplate: “api/{controller}/{id}”, defaults: new { id = RouteParameter.Optional } ); } } public class DummyHandler : DelegatingHandler { protected override Task SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) { […]

无法等待异步扩展方法

情况非常简单 – 我编写了一个扩展方法,并将其与返回类型Task进行异步。 但是当我尝试使用await调用它时,编译器会抛出一个错误,表明扩展方法根本不被识别为异步。 这是我的代码: public static async Task<NodeReference> CreateWithLabel(this GraphClient client, T source, String label) where T: class { var node = client.Create(source); var url = string.Format(ConfigurationManager.AppSettings[configKey] + “/node/{0}/labels”, node.Id); var serializedLabel = string.Empty; using (var tempStream = new MemoryStream()) { new DataContractJsonSerializer(label.GetType()).WriteObject(tempStream, label); serializedLabel = Encoding.Default.GetString(tempStream.ToArray()); } var bytes = Encoding.Default.GetBytes(serializedLabel); using (var […]

在C#中使用async而不等待?

考虑在没有等待的情况下使用async 。 想想也许你误解了异步的作用。 警告是完全正确的:如果您将方法标记为异步但不在任何地方使用等待,那么您的方法将不是异步的。 如果你调用它,方法中的所有代码将同步执行。 我想编写一个应该运行异步但不需要使用await的方法。例如在使用线程时 public async Task PushCallAsync(CallNotificationInfo callNotificationInfo) { Logger.LogInfo(“Pushing new call {0} with {1} id”.Fill(callNotificationInfo.CallerId, } 我想调用PushCallAsync并运行异步,不想使用等待。 我可以在C#中使用async而不等待吗?

在LINQ语句中使用async / await时实际发生了什么?

以下片段编译,但我希望它等待任务结果,而不是给我一个List<Task> 。 var foo = bars.Select(async bar => await Baz(bar)).ToList() 正如这里指出的,你需要使用Task.WhenAll : var tasks = foos.Select(async foo => await DoSomethingAsync(foo)).ToList(); await Task.WhenAll(tasks); 但是评论指出不需要在Select()内部进行async和await : var tasks = foos.Select(foo => DoSomethingAsync(foo)).ToList(); 这里有一个类似的问题,有人试图在Where()使用异步方法。 因此,在LINQ语句中async和await是合法的语法,但是它什么都不做或者它是否具有某种用途?

如何在C#6.0中实现INotifyPropertyChanged?

这个问题的答案已被编辑,说在C#6.0中,可以使用以下OnPropertyChanged过程实现INotifyPropertyChanged: protected void OnPropertyChanged([CallerMemberName] string propertyName = null) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } 但是,从该答案中不清楚相应的属性定义应该是什么。 使用此构造时,在C#6.0中完整实现INotifyPropertyChanged是什么样的?

我想等待抛出AggregateException,而不仅仅是第一个Exception

等待故障任务(具有exception集的任务)时, await将重新抛出存储的exception。 如果存储的exception是AggregateException ,它将重新抛出第一个并丢弃其余的exception。 我们如何使用await并同时抛出原始的AggregateException以便我们不会意外丢失错误信息? 注意,当然可以考虑使用hacky解决方案(例如,围绕await尝试catch,然后调用Task.Wait )。 我真的希望找到一个干净的解决方案。 这里最好的做法是什么? 我想过使用自定义awaiter,但内置的TaskAwaiter包含了许多魔法,我不知道如何完全重现。 它调用TPL类型的内部API。 我也不想重现所有这些。 如果你想玩它,这是一个简短的repro: static void Main() { Run().Wait(); } static async Task Run() { Task[] tasks = new[] { CreateTask(“ex1”), CreateTask(“ex2”) }; await Task.WhenAll(tasks); } static Task CreateTask(string message) { return Task.Factory.StartNew(() => { throw new Exception(message); }); } 在Run只抛出两个exception中的一个。 请注意,Stack Overflow上的其他问题无法解决此特定问题。 建议重复时请小心。

在没有等待#2的情况下调用异步方法

我有一个异步方法: public async Task ValidateRequestAsync(string userName, string password) { using (HttpClient client = new HttpClient()) { HttpResponseMessage response = await client.GetAsync(url); string stringResponse = await response.Content.ReadAsStringAsync(); return bool.Parse(stringResponse); } } 我这样称呼这个方法: bool isValid = await ValidateRequestAsync(“user1”, “pass1”); 我可以使用同步方法调用相同的方法,而不使用await关键字吗? 例如: public bool ValidateRequest(string userName, string password) { return ValidateRequestAsync(userName, password).Result; } 我认为这会导致僵局。 编辑 调用上面的方法会使调用永远不会结束。 (该方法不再到达终点)

为什么我不能从异步代码中捕获exception?

我读到它的任何地方都说下面的代码应该可行,但事实并非如此。 public async Task DoSomething(int x) { try { // Asynchronous implementation. await Task.Run(() => { throw new Exception(); x++; }); } catch (Exception ex) { // Handle exceptions ? } } 也就是说,我没有抓到任何东西,并且在“投掷”线上得到一个“未处理的例外”。 我在这里很无能为力。

使用void进行异步exception处理

我正在使用Async CTP编写IO重型控制台应用程序。 但我遇到exception问题。 public static void Main() { while (true) { try{ myobj.DoSomething(null); } catch(Exception){} Console.Write(“done”); //… } } //… public async void DoSomething(string p) { if (p==null) throw new InvalidOperationException(); else await SomeAsyncMethod(); } 并发生以下情况:“完成”被写入控制台,然后我在调试器中得到exception,然后我按继续我的程序存在 。 是什么赋予了?