Tag: 异步 等待

async / await – 这种理解是否正确?

经过两个问题和混乱 – 我想知道我是否最终做对了。 这是我的理解: async/await 仅用于一个目的 – 允许在已完成异步任务后执行代码。 例如 async Task CallerMethod() { await AsyncMethod(); AnotherMethod(); } 允许在异步AsyncMethod 完成后执行AsyncMethod ,而不是在AsyncMethod 启动后立即AsyncMethod 。 async / await NEVER 使任何异步。 它不会启动一个单独的线程(除非等待的方法当然会这样做),等等。 我的理解(最后)是否正确?

使用Async await方法异步读取串行端口

我用这种方式从串口读取: public static void Main() { SerialPort mySerialPort = new SerialPort(“COM1”); mySerialPort.BaudRate = 9600; mySerialPort.Parity = Parity.None; mySerialPort.StopBits = StopBits.One; mySerialPort.DataBits = 8; mySerialPort.Handshake = Handshake.None; mySerialPort.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler); mySerialPort.Open(); Console.WriteLine(“Press any key to continue…”); Console.WriteLine(); Console.ReadKey(); mySerialPort.Close(); } private static void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e) { SerialPort sp = (SerialPort)sender; string indata = […]

如何创建C#async powershell方法?

所以我想创建一种异步运行PowerShell脚本的方法。 下面的代码是我到目前为止,但它似乎不是异步,因为它锁定应用程序,输出不正确。 public static string RunScript(string scriptText) { PowerShell ps = PowerShell.Create().AddScript(scriptText); // Create an IAsyncResult object and call the // BeginInvoke method to start running the // pipeline asynchronously. IAsyncResult async = ps.BeginInvoke(); // Using the PowerShell.EndInvoke method, get the // results from the IAsyncResult object. StringBuilder stringBuilder = new StringBuilder(); foreach (PSObject result […]

同步函数内的异步调用

我正在尝试异步填充我的缓存 static ConcurrentDictionary data = new ConcurrentDictionary(); public static async Task GetStuffAsync(string key) { return data.GetOrAdd(key, async (x) => { return await LoadAsync(x); }); } static async Task LoadAsync(string key) {….} 但这给了我错误: 无法将异步lambda表达式转换为委托类型’System.Func’。 异步lambda表达式可能返回void,Task或Task,其中任何一个都不能转换为’System.Func’。 据我所知,这是因为GetOrAdd()不是异步的。 我该如何解决这个问题? 更新: LazyAsync建议的LazyAsync将在我的简单示例中起作用。 或者,像这样的解决方法(肯定可以忍受它引入的一些开销): public static async Task GetStuffAsync(string key) { string[] d = null; if (!data.ContainsKey(key)) d = await […]

如何安全地混合同步和异步代码?

我有这个纯粹同步的库。 它暴露了同步方法,我有客户端使用它。 对于想要使用它的人,我将底层实现更改为异步和公开的异步方法。 但现在我有很多复制代码。 异步代码似乎表现更好。 我希望现有客户能够利用它,我想消除代码重复。 有没有安全的方法来保持同步签名和调用异步实现? 在打电话时我特别害怕死锁.Result和.Wait。

考虑到使用Task.Run异步运行任何方法的能力,.Net Framework中的* Async方法的目的是什么?

简短的问题: 为什么.Net Framework添加了很多* Async版本的方法而不是开发人员只是使用Task.Run来异步运行同步方法? 详细问题: 我理解异步性的概念。 我知道Tasks 我知道async / await关键字。 我知道.Net Framework中的* Async方法有什么用。 我不明白的是库中* Async方法的目的。 假设您有两行代码: F1(); F2(); 关于数据/控制流程,只有两种情况: F1完成后需要执行F2 。 F2不需要等待F1完成。 我没有看到任何其他情况。 我没有看到任何一般需要知道执行某些function的具体线程(除了UI)。 线程中代码的基本执行模式是同步的。 并行性需要多个线程。 异步性基于并行性和代码重新排序。 但基地仍然是同步的。 当F1的工作量很小时,差异无关紧要。 但是当A花费大量时间完成时,我们可能需要查看情况,如果F2不需要等待F1完成,我们可以与F2并行运行F1 。 很久以前我们使用线程/线程池来做到这一点。 现在我们有Tasks 。 如果我们想并行运行F1和F2 ,我们可以写: var task1 = Task.Run(F1); F2(); 任务很酷,我们可以在最终需要完成任务的地方使用await 。 到目前为止,我认为没有必要制作F1Async()方法。 现在,我们来看一些特殊情况。 我看到的唯一真正特殊情况是UI。 UI线程是特殊的并且停止它会使UI冻结很糟糕。 正如我所看到的,Microsoft建议我们将UI事件处理程序标记为async 。 将方法标记为async意味着我们可以使用await关键字基本上在另一个线程上调度繁重的处理并释放UI线程,直到处理完成。 我不能再得到的是为什么我们需要任何* Async方法来等待它们。 我们总是可以写await Task.Run(F1); 。 […]

始终在库中的异步方法中使用“async”和“await”关键字?

简介 :在库方法中,何时应该使用async和await关键字而不是直接返回Task ? 我相信我的问题与此问题有关。 但是,这个问题是关于.NET 4.0和TPL,而我正在使用带有async和await关键字的.NET 4.6。 所以,我认为我的问题可能得到不同的答案,因为在回答链接问题时这些关键字不存在。 说明:我正在为外部WCF服务编写一个简单的包装器,并且包装器会进行多个SendAsync调用。 现在我认为每个包装器方法应该直接返回一个Task而不需要等待。 我的理解是应该在应用程序层上使用async / await ,而不是在库中。 因此,例如,我认为我应该为每个包装器方法采用的方法: private Task GetSignDataAsync(SigningRequestType request) { return _service.SendAsync(request); } 但是在互联网上,我找到了几个使用这种方法的post : private async Task GetSignDataAsync(SigningRequestType request) { return await _service.SendAsync(request).ConfigureAwait(false); } 这是我在technet上找到的另一个例子: async Task PutTaskDelay() { await Task.Delay(5000); } private async void btnTaskDelay_Click(object sender, EventArgs e) { await PutTaskDelay(); MessageBox.Show(“I am […]

为什么我必须使用等待方法来异步运行。 如果我不想在继续之前等待方法完成怎么办?

我整天都在倾听MSDN文档,他们的异步编码理念让我感到困惑。 据我了解,如果调用异步方法,则不会阻止调用异步方法的线程。 然而,async总是与await配对,这似乎否定了async-ness,使得外部方法必须等待代码执行无论如何。 我不应该能够调用异步方法然后继续执行外部方法吗? 这是我遇到过的场景,或多或少: void reportSomethingHappened(info) – Collect info – HTTP POST info to logging server (ie. mixpanel, sentry) 这里将是一个调用方法: void largerProcess if (whatever) reportSomethingHappened(); bla; bla; 据我所知,由于POST请求可以异步完成,我应该能够将reportSomethingHappened()转换为异步方法(通过AFAIK,等待webrequest,并添加async关键字)。 但是largeProcess方法不需要等待(即等待)报告方法完成以执行bla bla。 然而,VS告诉我,使用异步方法,我可以等待它,或者它会同步发生,然后阻塞。 这不是单独打败它的目的吗? 我怎么写这个,以便reportSomethingHappened不会阻止greaterProcess的执行? (这本身就让我感到困惑,因为我认为这一直是异步的重点)

异步/等待高性能服务器应用程序?

C#5中新的async / await关键字看起来非常有前途,但我读了一篇关于性能对这些应用程序影响的文章,因为编译器将为异步方法生成一个非常复杂的状态机。 使用这些关键字进行异步编程要容易得多,但是对套接字来说SocketAsyncEventArgs是不是很好? 第二个问题:像Stream.WriteAsync这样的异步IO方法是非同步的(.Net上的完成端口或Mono上的epoll / poll)还是这些方法用于将写入调用推送到线程池的廉价包装器? 第三个问题:除了UI应用程序的SynchronizationContext之外,有没有办法实现某种sinlge-threaded上下文? 像事件循环之类的东西,以便在主线程上继续完成任务? 我发现了Nito.AsyncEx库,但我不确定这是否是我需要的。

ToListAsync()根本没有完成

我想执行一些查询异步。 但是当我通过代码调试时,大多数情况下调用ToListAsync()时程序停止。 没有可见的exception,并且清除了callstack窗口。 当我按下VS中的暂停按钮时,我可以在调用当前方法之前看到堆栈帧。 var res1 = await context.Address().Where(…).ToListAsync(); var res2 = await context.Person().Where(…).ToListAsync(); var res3 = await context.Rule().Where(…).ToListAsync(); 有时第一次通话有效,在极少数情况下也是第二次通话。 但至少在第三次通话时程序停止了。 我完全不知道为什么……