Tag: asynchronous

如何与许多APM BeginXXX呼叫共享AsyncCallback?

我想用许多APM风格的异步方法重用我的代码。 每种方法都有一个BeginXXX和一个EndXXX签名对。 我想在每个函数中重用相同的回调。 我一直使用下面的匿名方法,但我不知道如何将其提取为可重用的forms。 我知道这应该很简单,但我无法弄清楚如何使用委托来实现这一目标。 (这就是我自学成才) var result = tableSymmetricKeys.BeginExecuteQuerySegmented(query, token, opt, ctx, (o) => { var response = (o.AsyncState as CloudTable).EndExecuteQuerySegmented(o); token = response.ContinuationToken; int recordsRetrieved = response.Results.Count; totalEntitiesRetrieved += recordsRetrieved; Console.WriteLine(“Records retrieved in this attempt = ” + recordsRetrieved + ” | Total records retrieved = ” + totalEntitiesRetrieved); evt.Set(); }, tableSymmetricKeys); 如何使用(o) […]

如何在TPL数据流中安排流量控制?

我试图控制TPL Dataflow中的数据流。 我有一个非常快的制作人和一个非常慢的消费者。 (我的真实代码更复杂,但是,这是一个非常好的模型,它重现了问题。) 当我运行它时,代码开始饮用内存,就像它的样式一样 – 并且生产者的输出队列尽可能快地填满。 我真正希望看到的是制作人停止运行一段时间,直到消费者有机会要求它。 根据我对文档的阅读,这是应该发生的事情:也就是说,我认为生产者等待消费者有空间。 显然情况并非如此。 如何修复它以便队列不会发疯? using System; using System.Linq; using System.Threading.Tasks; using System.Threading.Tasks.Dataflow; using System.Threading; namespace MemoryLeakTestCase { class Program { static void Main(string[] args) { var CreateData = new TransformManyBlock(ignore => { return Enumerable.Range(0, 1000 * 1000 * 1000).Select((s,i) => “Hello, World ” + i); }); var ParseFile […]

在ContinueWith()块中使用await

我有以下代码: var result = MessageBoxHelper.MsgBox .ShowAsync(“Press Yes to proceed”, MessageBoxButton.YesNo) .ContinueWith((answer) => { if (answer.Result == MessageBoxResult.Yes) { Task asyncTask = ExecuteAsyncFunc(); //asyncTask.Unwrap(); ?? asyncTask.ContinueWith((a) => { // More }, TaskContinuationOptions.OnlyOnRanToCompletion); } }, TaskContinuationOptions.OnlyOnRanToCompletion); } 像这样在其他地方调用: public async Task ExecuteAsyncFunc() { await CallAnotherAsyncFunction(); } 我相信我需要调用Unwrap(),我试过,因为我在ContinueWith()块中调用await。 但是,当我取消注释时,我收到以下错误: 错误CS1929’Task’不包含’Unwrap’的定义,最好的扩展方法重载’TaskExtensions.Unwrap(Task)’需要’Task’类型的接收器 我是否需要在此上下文中使用Unwrap,如果是这样,我做错了什么?

使用Async对List .ForEach()的任何指向?

我碰到了这段代码: items.ForEach(async item => { doSomeStuff(); await mongoItems.FindOneAndUpdateAsync(mongoMumboJumbo); await AddBlah(SqlMumboJumbo); }); 使这个.forEach委托有任何意义,或者它只是一个正常的foreach循环吗? 只要包含循环的函数是异步的,默认情况下这将是异步的吗?

C#中的异步方法不是异步的吗?

创建了以下控制台应用程序后,我有点困惑为什么它似乎同步运行而不是异步运行: class Program { static void Main(string[] args) { Stopwatch stopwatch = new Stopwatch(); stopwatch.Start(); var total = CreateMultipleTasks(); stopwatch.Stop(); Console.WriteLine(“Total jobs done: {0} ms”, total.Result); Console.WriteLine(“Jobs done in: {0} ms”, stopwatch.ElapsedMilliseconds); } static async Task CreateMultipleTasks() { var task1 = WaitForMeAsync(5000); var task2 = WaitForMeAsync(3000); var task3 = WaitForMeAsync(4000); var val1 = await task1; […]

ASP.NET WebApi中的Fire-forget和单向调用

我完全理解HTTP世界不是单向调用的最佳选择,WebApi最适合HTTP冗长通信。 毫无疑问,WCF是这里的赢家。 但是,如果你已经有一个暴露了一堆动词的ApiController怎么办呢?在某些时候你也需要一个单向调用呢? 并且您不希望为此托管/维护另一个服务(WCF)。 Task response = client.PostAsJsonAsync(“api/log”, log) 如果您没有处理响应,那么您将获得类似于“即发即忘”的内容。 这是WebApi中的唯一方法还是另一种解决方案?

在循环内部,每个异步调用是否使用task的continuewith链接到返回的任务?

最佳实践是收集循环内集合中的所有async调用,并执行Task.WhenAll() 。 但是,想要了解在循环中遇到await时会发生什么,返回的Task包含什么? 那些进一步的async调用呢? 它会创建新任务并按顺序将它们添加到已返回的Task吗? 根据下面的代码 private void CallLoopAsync() { var loopReturnedTask = LoopAsync(); } private async Task LoopAsync() { int count = 0; while(count < 5) { await SomeNetworkCallAsync(); count++; } } 我假设的步骤是 LoopAsync被调用 count设置为零,代码进入while循环,条件被检查 SomeNetworkCallAsync ,等待返回的任务 创建新任务/等待 新任务返回CallLoopAsync () 现在,只要有足够的时间让进程SomeNetworkCallAsync ,如何/以何种方式,将执行下一个代码行如count++和更多的SomeNetworkCallAsync ? 更新 – 基于Jon Hanna和Stephen Cleary : 所以有一个Task,该Task的实现将涉及5次对NetworkCallAsync的调用,但是使用状态机意味着这些任务不需要明确地链接到这个就可以工作。 例如,这允许它根据任务的结果决定是否中断循环,等等。 虽然它们没有链接,但每个调用都会等待前一个调用完成,因为我们使用了await (在状态m / […]

检查对异步方法的Received()调用

当我运行以下代码时: [Test] public async Task Can_Test_Update() { var response = await _controller.UpdateAsync(Guid.NewGuid()); response.Valid.Should().BeTrue(); _commands.Received().UpdateAsync( Arg.Is( l => l.Status == Status.Updated)); } 如果我在“ _commands.Received().UpdateAsync ”之前添加“ await ”,它会抛出一个空引用exception。 我该如何阻止这种情况发生,或await没有必要?

具有匿名委托的Dispatcher.Invoke适用于Silverlight但不适用于WPF

在Silverlight 4中,我有一个自定义服务类,它具有异步的Completed事件。 在Completed事件中,我获取返回的数据并通过以下方式调用populate方法: private void service_Completed(object sender, CompletedEventArgs args) { Dispatcher.BeginInvoke(() => populateInbox(args.Jobs)); } private void populateInbox(List jobs) { inbox.DataContext = jobs; } BeginInvoke在SL4中工作,但是当我将它移植到WPF时,我收到以下错误: 无法将lambda表达式转换为类型’System.Delegate’,因为它不是委托类型 我尝试将其更改为内联,匿名,参与代表: Dispatcher.BeginInvoke(delegate(List jobs) { inbox.DataContext = jobs; }); 但是,这会产生相同的编译时错误。 知道如何在WPF中使用它吗? 重构使用BackgroundWorker对我来说不是一个选择。

如何在后台实现UDP监听器? (可用于log4net)

我想在后台运行这个UDPListener : // launch this in a background thread private static void UDPListen() { IPEndPoint remoteEndPoint = new IPEndPoint(IPAddress.Any, 0) using( var udpClient = new UdpClient(10000)) { while (true) { var buffer = udpClient.Receive(ref remoteEndPoint); var loggingEvent = System.Text.Encoding.Unicode.GetString(buffer); // … } } } 我可以将它放在Task.Run()并在while()循环中运行吗?