Tag: async await

C#Mongo FirstOrDefaultAsync挂起

使用2.0驱动程序,以下代码有时会挂起并永远不会返回。 public async Task GetFirst(FilterDefinition query) { return await GetCollection.Find(query).FirstOrDefaultAsync(); } 如果我首次亮相并在回程线上设置一个断点,一切都会恢复正常。 在shell中运行的查询是这样的: db.Customers.find({“Name” : /test$/i})

同时等待具有独立延续的多个异步调用

在几种情况下,我需要调用多个异步调用(来自相同的事件处理程序),这些异步调用可以彼此独立地进行,每个异步调用都有自己的更新UI的延续。 以下天真实现会导致三个异步操作按顺序执行: private async void button_Click(object sender, RoutedEventArgs e) { nameTextBox.Text = await GetNameAsync(); cityTextBox.Text = await GetCityAsync(); rankTextBox.Text = await GetRankAsync(); } 有一个MSDN示例建议将任务的创建与其各自的await语句分开,允许它们并行运行: private async void button_Click(object sender, RoutedEventArgs e) { var nameTask = GetNameAsync(); var cityTask = GetCityAsync(); var rankTask = GetRankAsync(); nameTextBox.Text = await nameTask; cityTextBox.Text = await cityTask; rankTextBox.Text = await […]

如何编写C#5异步?

我有以下情况: 当输入命令时(为了测试,它是一个控制台应用程序,当它准备就绪时,我希望它将是一个WebService)我执行一些代码,当需要进一步的用户输入时,我立即返回命令解释器。 当给出新输入时,我希望处理从我离开它的地方继续。 这听起来很像c#5 async-await模式,我决定尝试一下。 我在想这个: public void CommandParser() { while(true) { string s = Console.ReadLine(); if (s == “do_something”) Execute(); else if (s == “give_parameters”) SetParameters(); //… } } MySettings input; public async void Execute() { //do stuff here MyResult result = null if (/*input needed*/){ input = new MySetting(); result = await input.Calculate(); […]

使用HttpClient和ContinueWith的Paralell.ForEach

我有一个方法尝试从并行的几个URL下载数据,并返回IEnumerable反序列化类型 该方法如下所示: public IEnumerable DownloadContentFromUrls(IEnumerable urls) { var list = new List(); Parallel.ForEach(urls, url => { lock (list) { _httpClient.GetAsync(url).ContinueWith(request => { var response = request.Result; //todo ensure success? response.Content.ReadAsStringAsync().ContinueWith(text => { var results = JObject.Parse(text.Result) .ToObject<IEnumerable>(); list.AddRange(results); }); }); } }); return list; } 在我的unit testing中(我存根_httpClient返回一组已知的文本)我基本上得到了 序列不包含任何元素 这是因为该方法在任务完成之前返回。 如果我在.ContinueWith()调用结束时添加.Wait(),它会通过,但我确定我在这里滥用了API …

C#异步方法一直调用Main

有人可以澄清这个例子,当然,这个例子不起作用: class Program { static void Main(string[] args)//main cant’ be async { int res = test();//I must put await here Console.WriteLine(“END”); } public async static Task test() { //why can’t I make it just: public int test()?? int a1, a2, a3, a4; a1 = await GetNumber1(); a2 = await GetNumber2(); a3 = await GetNumber3(); a4 […]

Task.ContinueWith捕获调用线程上下文以继续吗?

下面的Test_Click是在UI线程(使用WindowsFormsSynchronizationContext )上运行的代码的简化版本: void Test_Click(object sender, EventArgs e) { var task = DoNavigationAsync(); task.ContinueWith((t) => { MessageBox.Show(“Navigation done!”); }, TaskScheduler.FromCurrentSynchronizationContext()); } 我应该显式指定TaskScheduler.FromCurrentSynchronizationContext()以确保将在同一UI线程上执行继续操作吗? 或者ContinueWith自动捕获执行上下文(因此,在这种情况下使TaskScheduler参数成为冗余)? 我认为默认情况下不会这样做(不像await ),但到目前为止我找不到在线资源来确认这一点。

如何使用async / await方法管理类似NDC的log4net堆栈? (每个任务堆栈?)

在普通/同步/单线程控制台应用程序中,NDC.Push可以很好地管理“当前项目”(可能在多个嵌套级别,但对于此示例仅为1级)。 例如: private static ILog s_logger = LogManager.GetLogger(“Program”); static void Main(string[] args) { BasicConfigurator.Configure(); DoSomeWork(“chunk 1”); DoSomeWork(“chunk 2”); DoSomeWork(“chunk 3”); } static void DoSomeWork(string chunkName) { using (NDC.Push(chunkName)) { s_logger.Info(“Starting to do work”); Thread.Sleep(5000); s_logger.Info(“Finishing work”); } } 这将导致期望日志输出,显示“程序”右侧的“块X”NDC条目(基本配置器的默认模式) 232 [9] INFO程序块1 – 开始工作 5279 [9] INFO计划块1 – 完成工作 5279 [9] INFO程序块2 – 开始工作 10292 […]

async关键字和TaskScheduler的选择

我想知道编译器在使用async关键字进行编译时选择TaskScheduler的方式背后的原因。 我的测试方法由OnConnectedAsync方法上的SignalR(ASP.NET主机,IIS8,websocket传输)调用。 protected override async Task OnConnectedAsync(IRequest request, string connectionId) { SendUpdates(); } 在Current同步上下文中启动任务将导致System.Web.AspNetSynchronizationContext.OperationStarted()中的InvalidOperationException 此时无法启动异步操作。 异步操作只能在异步处理程序或模块中启动,或者在页面生命周期中的某些事件中启动。 如果在执行页面时发生此exception,请确保将页面标记为 。 精细。 使用此SendUpdates定义,我得到以上exception: private async void SendUpdates() { Task.Run(async () => { while (true) { await Task.Delay(1000); await Connection.Broadcast(“blabla”); } }); } 但更有趣的是,当我没有得到例外。 以下作品: private void SendUpdates() 以下也有效 private async Task SendUpdates() 这最后一个也有效,但它与上面的例子基本相同。 private Task SendUpdates() { return […]

使用Umbraco 7的异步控制器操作返回字符串

是否可以在Umbraco SurfaceController(和UmbracoApiController)中使用异步操作 我尝试了以下代码 public async Task HandleLogin(LoginViewModel model) { await Task.Delay(1000); return PartialView(“Login”, model); } 虽然它在调用动作时正确编译,但是一旦命中await,动作似乎就会返回,并返回一个字符串 System.Threading.Tasks.Task`1 [System.Web.Mvc.ActionResult] 控制器当然inheritance自SurfaceController ,我想知道这是不是问题? 如果这不可能,是否有任何变通方法来实现异步操作行为? 任何帮助都会感激不尽!

为什么不调用Task .Result死锁?

几个月前阅读这篇文章之后,我变得很擅长获取Task的Result ,并且通过ConfigureAwait(false)或Task.Run不断地将所有调用包裹Task.Run 。 但是,由于某种原因,以下代码成功完成: public static void Main(string[] args) { var arrays = DownloadMany(); foreach (var array in arrays); } IEnumerable DownloadMany() { string[] links = { “http://google.com”, “http://microsoft.com”, “http://apple.com” }; using (var client = new HttpClient()) { foreach (var uri in links) { Debug.WriteLine(“Still here!”); yield return client.GetByteArrayAsync(uri).Result; // Why doesn’t this deadlock? } […]