Tag: async await

Async Disposable.Create

Disposable.Create需要Action作为参数。 在处理Rx订阅时运行Action 。 在处理Rx订阅时,我想运行一些异步清理代码,但是使用带有Action async () =>与async void相同,我想避免使用它。 有关我为什么要避免这种情况的详细信息,请参阅此处 。 是否可以创建类似Disposable.AsyncCreate东西,它接受Func而不是Action 。 如果是这样,我应该如何将它作为CompositeDisposable一部分使用? 还是有其他模式来处理异步处置?

在非托管主机下获取托管组件中的空闲处理片段

我有一个用C#编写的托管组件,它由一个传统的Win32应用程序作为ActiveX控件托管。 在我的组件中,我需要能够获得通常是Application.Idle事件,即获取UI线程上的空闲处理时间的时间片(它必须是主UI线程)。 但是,在此托管方案中, Application.Idle不会被触发,因为没有托管消息循环(即,没有Application.Run )。 遗憾的是,主机也没有实现IMsoComponentManager ,它可能适合我需要的东西。 由于许多好的原因,冗长的嵌套消息循环(使用Application.DoEvents )不是一个选项。 到目前为止,我能想到的唯一解决方案是使用普通的Win32定时器 。 根据http://support.microsoft.com/kb/96006,WM_TIMER具有最低优先级之一,仅遵循WM_PAINT ,这应该让我尽可能接近空闲。 我是否缺少此方案的其他选项? 这是一个原型代码: // Do the idle work in the async loop while (true) { token.ThrowIfCancellationRequested(); // yield via a low-priority WM_TIMER message await TimerYield(DELAY, token); // eg, DELAY = 50ms // check if there is a pending user input in Windows message […]

任务异步控制器方法没有命中

所以,我们有一个MVC项目,已经通过不同版本的MVC从1升级到4。 现在我们有一个控制器方法: public async Task IndexAsync() 所以,如果我们去http://somedomain.xyz/WhicheverController 或 http://somedomain.xyz/WhicheverController/Index ,我们将迎来404。 http://somedomain.xyz/WhicheverController/IndexAsync路由到方法就好了。 我们的路由出了什么问题?

为什么void方法必须异步才能等待?

假设我有一个具有void返回类型的方法,并且我需要await此方法中的操作。 public void someOperation() { //dostuff var res = await someOtherOperation(); //do some other stuff that needs res. } 当我尝试编译此代码时,我得到错误,说someOperation必须声明为async 。 我不明白为什么。 我理解为什么如果方法有一个返回值,但是当它void时不会出现。 甚至在等待操​​作对方法的返回值没有影响的情况下。 这已经被问到这个问题的一部分,但我找不到我想要的答案。 这家伙只是提到: async关键字启用await关键字。 因此,任何使用await的方法都必须标记为异步。 首先,我不确定async关键字启用await关键字是什么意思。 其次,重申我的问题,我不确定为什么需要它?

我应该用Task.Run包装慢速调用吗?

我有这个ASP MVC调用,它是aync,因为它需要进行异步调用。 我注意到有几个慢同步调用(例如数据库访问)。 该方法需要具有所有可用的返回数据才能继续。 我想用Task.Run包装同步调用并等待所有这些调用。 包装慢同步调用是否有意义? 如果只有同步通话怎么办?

将IEnumerable 转换为IObservable ,具有最大并行度

我有一系列异步任务要做(比如,获取N个网页)。 现在我想要的是将它们全部暴露为IObservable 。 我目前的解决方案使用了这个问题的答案: async Task GetPage(string page) { Console.WriteLine(“Before”); var result = await FetchFromInternet(page); Console.WriteLine(“After”); return result; } // pages is an IEnumerable IObservable resultObservable =pages.Select(GetPage). Select(t => Observable.FromAsync(() => t)).Merge(); // Now consume the list foreach(ResultObj obj in resultObservable.ToEnumerable()) { Console.WriteLine(obj.ToString()); } 问题是我不知道要获取的页面数量,而且可能很大。 我不想同时发出数百个请求。 所以我想要一种方法来限制并行执行的最大任务数。 有没有办法限制GetPage的并发调用GetPage ? 有一个Merge重载,它接受一个maxConcurrent参数,但它似乎并没有实际限制函数invokation的并发性。 控制台在After消息之前打印所有Before消息。 注意:我需要转换回IEnumerable 。 我正在编写一个系统的数据源,它给我提取数据的描述符,我需要给它一个下载数据的列表。

参考异步任务

如何将引用作为参数传递给Windows Store App中的Async方法? 我正在寻找这样的东西: var a = DoThis(ref obj.value); public async Task DoThis(ref int value) { value = 10; } 但是错误: 异步方法不能有ref或out参数 还有别的办法吗? 注意: 我需要传递完全obj.value。 此方法将由不同类型的对象,相同类型的对象,一个对象使用,但我将传递obj.val_1,obj.val_2或obj.val_10。 所有值都是相同的类型(对于ex string)

System.Messaging – 为什么MessageQueue不提供异步版本的Send

有谁知道为什么System.Messaging不提供Send方法的异步版本来向队列发送MSMQ消息。 实际上有Peek和Receive方法的异步版本(通过Begin / End对可以转换为C#5 async awaitable方法),但是很明显没有提供BeginSend / EndSend方法,只是一个Send方法,在我看来像这是一个同步阻塞I / O调用。 我认为这不是System.Messaging的限制,而是System.Messaging正在使用的本机消息队列API(mqrt.dll)之一,它将重叠结构作为函数MQReceiveMessage的参数使用与IOCP重叠的I / O虽然函数MQsendMessage没有采用这样的结构,所以看起来它是一个纯粹的同步调用。 我的问题仍然存在,任何人都会知道为什么MessageQueue API不提供向队列发送消息的异步方式?

如何在同步代码中使用await / async?

我正在尝试使用await / async以使某些同步代码异步。 例如,这可以解除UI线程的阻塞: private async void button1_Click(object sender, EventArgs e) { var task = DoRequestAsync(); textBox1.Text = “starting async task”; var text = await task; textBox1.Text = text; } private async Task DoRequestAsync() { try { var client = new HttpClient(); client.Timeout = new TimeSpan(0, 0, 0, 5); await client.GetAsync(“http://123.123.123.123”); // force a timeout […]

异步等待保持事件发生

我在C#.NET应用程序中有关于async \ await的问题。 我实际上是在基于Kinect的应用程序中尝试解决这个问题但是为了帮助我说明,我已经制作了这个类似的例子: 想象一下,我们有一个名为timer1的Timer,它设置了Timer1_Tick事件。 现在,我对该事件采取的唯一操作是使用当前日期时间更新UI。 private void Timer1_Tick(object sender, EventArgs e) { txtTimerValue.Text = DateTime.Now.ToString(“hh:mm:ss.FFF”, CultureInfo.InvariantCulture); } 这很简单,我的UI每隔几百分钟更新一次,我很高兴看到时间流逝。 现在想象一下,我也想用同样的方法计算前500个素数,如下: private void Timer1_Tick(object sender, EventArgs e) { txtTimerValue.Text = DateTime.Now.ToString(“hh:mm:ss.FFF”, CultureInfo.InvariantCulture); List primeNumbersList = WorkOutFirstNPrimeNumbers(500); PrintPrimeNumbersToScreen(primeNumbersList); } private List WorkOutFirstNPrimeNumbers(int n) { List primeNumbersList = new List(); txtPrimeAnswers.Clear(); int counter = 1; while (primeNumbersList.Count < […]