Tag: 异步 等待

将async添加到方法签名是一个重大变化吗?

在解决有关使用异步/等待多少的问题时,即“所有方法应该返回Task吗?”, 这个答案的作者MatíasFidemraizer声称,即使你的方法目前只做同步的东西,它仍然应该返回任务,所以如果你以后做了异步的东西,“你可以把它变成实际的异步操作而不影响整个代码库”。 这是有道理的,但如果我实际上在等待某些东西,我必须在方法签名中添加async 。 所以我们谈论的是: public Task WhateverAsync() { return Task.FromResult(true); } 至 public async Task WhateverAsync() { return await AwaitableSomething(); } 将async添加到方法签名是一个重大变化吗?

异步内存流方式:以下哪项?

我正在研究使用异步内存流的解决方案,我正在考虑实现这种方法的正确方法。 哪一个比较方便? 第一个,简单: //First approach: linear async private async static Task WriteToStreamFirstVariant() { MemoryStream memoryStream = new MemoryStream(); byte[] data = new byte[256]; try { await memoryStream.WriteAsync(data, 0, data.Length); } catch(Exception exception) { //Handling exception } finally { memoryStream.Dispose(); } } 或者第二个嵌套任务和闭包? //Second approach: nested tasks async private async static Task WriteToStreamSecondVariant() { await Task.Run(async […]

使用async / await将现有C#同步方法转换为异步?

从同步I / O绑定方法开始(如下所示),如何使用async / await使其异步? public int Iobound(SqlConnection conn, SqlTransaction tran) { // this stored procedure takes a few seconds to complete SqlCommand cmd = new SqlCommand(“MyIoboundStoredProc”, conn, tran); cmd.CommandType = CommandType.StoredProcedure; SqlParameter returnValue = cmd.Parameters.Add(“ReturnValue”, SqlDbType.Int); returnValue.Direction = ParameterDirection.ReturnValue; cmd.ExecuteNonQuery(); return (int)returnValue.Value; } MSDN示例都假设存在* Async方法,并且没有为I / O绑定操作自己创建一个指导。 我可以使用Task.Run()并在该新任务中执行Iobound(),但不鼓励创建新任务,因为该操作不受CPU限制。 我想使用async / await,但我仍然坚持这个如何继续转换此方法的基本问题。

如何确保Task.Delay更准确?

我有一个WPF应用程序,它广泛使用await和async方法。 有几个地方我叫await Task.Delay(…); 插入暂停。 但是我遇到的麻烦是虽然很多这些停顿都可以稍微偏离,但有些地方我绝对需要暂停才能准确。 换句话说,如果我调用await Task.Delay(2000); 在我的应用程序中有一些地方我需要保证它只会暂停2秒(而不是2.2秒)。 我相信问题来自于我确实有很多不同的异步方法,所以当我告诉其中一个延迟时,线程池中没有足够的线程,当它应该恢复活着时,结果,无意中,延迟比预期的更长。 当您的业务需要尽可能准确地延迟时,线程的C#“最佳实践”是什么? 很明显,异步方法似乎并不足够(即使它们很好阅读)。 我应该手动创建具有更高优先级的线程并使用Thread.Sleep吗? 我是否增加了线程池中的线程数? 我使用BackgroundWorker吗?

为什么即使我尝试从工作器更改UI,同步上下文也为null,为什么工作人员在UI线程上等待,即使我不这样做?

我点击一个表单上的按钮,我称之为FooAsync并在完成时阻止UI线程。 以下是代码和我的问题。 using System; using System.Diagnostics; using System.Threading; using System.Threading.Tasks; using System.Windows.Forms; namespace SynContextIfIDontTouchUIInWorkerThread { public partial class Form1 : Form { public Form1() { InitializeComponent(); } #pragma warning disable 1998 private async void button1_Click(object sender, EventArgs e) { // Nicely prints out the WindowsForms.SynchronizationContext // because we *are* indeed on the UI thread this.Text […]

异步/等待模式会对次要工作单元造成性能损失吗?

我正在寻找关于异步/等待有意义的“工作负载阈值”(例如释放IO完成端口并避免线程饥饿)与工作单元执行过于简单/便宜之间的一些指导,因此同步执行是一个更好的选择。 换句话说,当与相对快速/资源廉价的工作单元结合使用时,async / await的使用是否会导致性能下降,并且简单地同步执行工作将是首选方法? 示例(所有在一个方法中,所有异步与等待): 保存对DB的一些小更新 使用ReadAsStreamAsync将非常小的文件上载读取到流中 使用CopyToAsync将读取流复制到文件流 使用FlushAsync写入器流

Web服务意外地同步运行

我们有一个需要连接到慢速数据库进程并将值返回给客户端的Web服务,因此尝试异步运行它以阻止它阻塞线程。 但是,如果我们进行两次调用,它们会按顺序运行,而不是异步运行。 呼叫1在5秒后返回,在10后呼叫2,在15后呼叫3,依此类推。 这是(简化测试版)代码 – public class ImportAsyncController : AsyncController { [HttpPost] [Authorize(Roles = “Admin, ContentAdmin, ContentEdit”)] public async Task SlowProcess() { await Task.Delay(5000); return “Hello, world!”; } } IIS 7.5,默认设置。 遗产项目所以并非完全不可能,项目文件中的某些内容会强制它,但不知道是什么,抱歉。 作为参考,从中调用的实际代码调用SQL服务器sproc。 它在内部使用sp_getapplock进行并发逻辑,并在SSMS中运行时正确返回 – 调用1运行完成,如果调用1仍在运行,则调用> 1返回错误代码,否则返回自身完成。 那个逻辑很好; 问题实际上是在队列中按顺序处理Web请求,因此在调用1完成之前,甚至不会调用call> 1。 我们做错了什么?

async和await不起作用

我正在尝试学习async并等待.NET 4.5的function。首先,这是我的代码 static async void Method() { await Task.Run(new Action(DoSomeProcess)); Console.WriteLine(“All Methods have been executed”); } static void DoSomeProcess() { System.Threading.Thread.Sleep(3000); } static void Main(string[] args) { Method(); //Console.WriteLine(“Method Started”); Console.ReadKey(); } 此代码不会在控制台上给我任何结果。 我不明白为什么。 我的意思是不是任务假设只是没有阻塞的线程。 但是,如果我在main方法中取消注释Console.WriteLine(),一切似乎都正常工作。 谁能告诉我这里发生了什么?

任务列表中空条目的奇怪外观

这是涉及的代码: private static async Task DoRunInOrderAsync(SemaphoreSlim sem, IObservable taskSeedSource, CreateTaskDelegate createTask, OnTaskErrorDelegate onFailed, OnTaskSuccessDelegate onSuccess) where TTaskSeed : class { var tasks = await taskSeedSource .Select(taskSeed => GetPendingOrRunningTask(taskSeed, createTask, onFailed, onSuccess, sem)) .ToList() .ToTask(); await Task.WhenAll(tasks); } private static async Task GetPendingOrRunningTask(T taskSeed, CreateTaskDelegate createTask, OnTaskErrorDelegate onFailed, OnTaskSuccessDelegate onSuccess, SemaphoreSlim sem) where T : class […]

不等待时TaskCanceledException

每当我同步返回另一个任务而不是等待它时,我似乎得到一个TaskCanceledException ,遵循最后等待时的指导原则。 TaskCanceledException代码 public static class Download { public static Task FromYouTubeAsync(string videoUri) { using (var client = new HttpClient()) { return FromYouTubeAsync( () => client .GetStringAsync(videoUri), uri => client .GetByteArrayAsync(uri)); } } public async static Task FromYouTubeAsync( Func<Task> sourceFactory, Func<string, Task> downloadFactory) { string source = await // TaskCanceledException here sourceFactory() .ConfigureAwait(false); // find […]