Tag: async await

如何启动异步任务对象

我想同时启动一个Task对象的集合,并等待所有对象完成。 以下代码显示了我想要的行为。 public class Program { class TaskTest { private Task createPauseTask(int ms) { // works well return Task.Run(async () => // subsitution: return new Task(async () => { Console.WriteLine($”Start {ms} ms pause”); await Task.Delay(ms); Console.WriteLine($”{ms} ms are elapsed”); }); } public async Task Start() { var taskList= new List(new[] { createPauseTask(1000), createPauseTask(2000) }); // […]

如何在计时器中使用async和await

我的Windows应用程序的要求是: 使用HttpWebRequest在一个线程中每3秒获取一次Web请求/响应(总共大约有10个线程用于执行此Web请求/响应。) 每个线程使用一些全局变量。 我想使用System.Timers.Timer和async并等待。 但我不知道这是高性能的最佳方式。 然后如何测试它们。 我是C#的绿色。

数据的异步处理

在那一刻我试图组装一个异步tcp服务器来接收我想要处理的数据,提取值并插入到sql server。 我认为最好的基本概念是一旦数据被接收并确认为整个消息,那么消息应该被传递到某种集合以等待基于FIFO的处理,这将解析值并将它们插入到sql server。 我想这就是消费者/生产者模式。 我一直在寻找最好的收集/方式来做到这一点,到目前为止看到BlockingCollection,ConcurrentCollection和BufferBlock使用async / await,我认为这可能是要走的路,但说实话我不确定。 我找到的最好的例子是Stephen Cleary的博客,特别是这篇文章, http://blog.stephencleary.com/2012/11/async-producerconsumer-queue-using.html 我的主要保留意见是,我绝不想放慢速度或中断接收消息,我建议使用多个生产者/消费者示例,这可以在上面的链接中看到,但我想知道的是; 我在这个假设中是正确的,还是在我的场景中有更合适的方法。 如果我在我的假设中是正确的,那么考虑到我的用例,任何人都可以建议实现这一点的最佳方法。 任何和所有的帮助非常感谢。

为什么在ThreadAbortException中有时*没有执行finally块*如果它包含await?

更新:我不认为这个问题是否可以重复, 最后可以跳过ThreadAbortException? 因为(1)我没有创建另一个线程,所以不存在竞争条件,(2)只有当finally块包含await时才会出现这种行为,而其他问题没有提及。 考虑这个控制台程序: class Program { static void Main() { try { T().GetAwaiter().GetResult(); } catch (ThreadAbortException) { Thread.ResetAbort(); } catch { } } static async Task Abort() { //await Task.Delay(1); // A Thread.CurrentThread.Abort(); // B } static async Task T() { try { await Abort(); } catch { Console.WriteLine(“catch”); throw; } finally { Console.WriteLine(“finally”); […]

如何使用C#使用Protobuf进行非阻塞套接字读取?

让我们说我想从网络套接字进行非阻塞读取。 我可以异步等待套接字读取x字节,一切都很好。 但是如何通过protobuf将其与反序列化相结合? 从流中读取对象必须阻塞? 也就是说,如果流包含的解析器数据太少,那么必须在后台进行一些阻塞,以便读者可以获取所需的所有字节。 我想我可以使用lengthprefix分隔符并读取第一个字节,然后计算出在解析之前我必须获取最少的字节数,这是正确的方法吗? 例如,如果我的缓冲区是500字节,则等待那500个字节,并解析长度前缀,如果长度超过500,则再次等待,直到读取所有内容。 结合非阻塞IO和protobuf解析的惯用方法是什么? (我现在正在使用Jon Skeet的实现http://code.google.com/p/protobuf-csharp-port/ )

如何在addrange select语句中添加异步“await”?

我有这样的function: public async Task SampleFunction() { var data = service.GetData(); var myList = new List(); myList.AddRange(data.select(x => new SomeViewModel { Id = x.Id, DateCreated = x.DateCreated, Data = await service.GetSomeDataById(x.Id) } return myList; } 我的await不起作用,因为它只能用于标记有async修饰符的方法或lambda。 我在哪里放置async与此function?

将后台工作程序更新为async-await

因此,这就是我目前使用后台工作程序将大量内容保存到文件中的方式,同时向用户显示进度条并防止在保存过程中对UI进行任何更改。 我想我已经掌握了基本function。 模态ProgressWindow显示进度条而不是其他内容。 如果必须的话,我将如何将其更改为async-await模式? private ProgressForm ProgressWindow { get; set; } /// On clicking save button, save stuff to file void SaveButtonClick(object sender, EventArgs e) { if (SaveFileDialog.ShowDialog() == DialogResult.OK) { if (!BackgroundWorker.IsBusy) { BackgroundWorker.RunWorkerAsync(SaveFileDialog.FileName); ProgressWindow= new ProgressForm(); ProgressWindow.SetPercentageDone(0); ProgressWindow.ShowDialog(this); } } } /// Background worker task to save stuff to file void BackgroundWorkerDoWork(object sender, […]

等待事件处理程序

所以这里是删除和事件 public delegate Task SomeEventHandler(SomeEventArgs e); … public event SomeEventHandler OnSomething; 订阅者(多个) some.OnSomething += DoSomething; … public async Task DoSomething(SomeEventArgs e) { await SomethingElse(); eA = true; } 事件电话 if (this.OnSomething != null) await this.OnSomething(args); // Here args.A is false // It should be true 问题是即使DoSomething没有完成,最后一部分也会继续。 会出现什么问题?

对于表示返回void 的操作的任务,Task.FromResult ()的替代方法是什么?

返回没有generics类型参数的任务的最佳方法是什么? 换句话说,一个任务代表一个不返回任何东西或返回void ? 换句话说,我正在寻找以下替代方案: T value = default(T); return Task.FromResult(value); // and var tcs = new TaskCompletionSource(); tcs.SetResult(value); return tcs.Task; 但对于代表不应返回任何内容的操作的任务。

如何聚合来自异步生成器的数据并将其写入文件?

我正在学习C#中的异步/等待模式。 目前我正在尝试解决这样的问题: 有一个生产者(硬件设备)每秒生成1000个数据包。 我需要将此数据记录到文件中。 设备只有一个ReadAsync()方法一次报告一个数据包。 我需要缓冲数据包并按照它们生成的顺序将它们写入文件,每秒只执行一次。 如果写入过程没有在下一批数据包准备好写入时及时完成,则写操作应该失败。 到目前为止,我写了类似下面的内容。 它有效,但我不确定这是否是解决问题的最佳方法。 有任何意见或建议吗? 在消费者需要汇总从生产者处收到的数据时,采用这种生产者/消费者问题的最佳做法是什么? static async Task TestLogger(Device device, int seconds) { const int bufLength = 1000; bool firstIteration = true; Task writerTask = null; using (var writer = new StreamWriter(“test.log”))) { do { var buffer = new byte[bufLength][]; for (int i = 0; i { foreach (var […]