Questions tagged «async-await»

这涵盖了使用async和await关键字的各种编程语言支持的异步编程模型。

4
无法将类型'string'隐式转换为'System.Threading.Tasks.Task <string>'
我是异步编程的新手,因此在研究了一些异步示例代码之后,我想到了编写一个简单的异步代码 我创建了一个简单的Winform应用程序,并在Form内编写了以下代码。但是它只是不起作用 private Task&lt;string&gt; methodAsync() { Thread.Sleep(10000); return "Hello"; //Error: Cannot implicitly convert type 'string' to 'System.Threading.Tasks.Task&lt;string&gt;' } private async void button1_Click(object sender, EventArgs e) { string s = await methodAsync(); MessageBox.Show(s); } 有人可以在这里放点光..

2
我为什么要麻烦使用Task.ConfigureAwait(continueOnCapturedContext:false);
考虑以下Windows窗体代码: private async void UpdateUIControlClicked(object sender, EventArgs e) { this.txtUIControl.Text = "I will be updated after await - i hope!"; await Task.Delay(5000).ConfigureAwait(continueOnCapturedContext: false); this.txtUIControl.Text = "I am updated now."; } 此处在第三行引发异常,因为在等待之后,代码将在非UI线程上执行。在哪里ConfigureAwait(false)有用?

2
TPL与异步/等待(线程处理)之间的区别
试图了解TPL&async/await与线程创建之间的区别。 我相信TPL(TaskFactory.StartNew)的工作方式ThreadPool.QueueUserWorkItem与之类似,因为它使线程池中的线程上的工作排队。当然,除非您使用TaskCreationOptions.LongRunning它创建一个新线程。 我认为async/await本质上将类似地工作: TPL: Factory.StartNew( () =&gt; DoSomeAsyncWork() ) .ContinueWith( (antecedent) =&gt; { DoSomeWorkAfter(); },TaskScheduler.FromCurrentSynchronizationContext()); Async/ Await: await DoSomeAsyncWork(); DoSomeWorkAfter(); 将是相同的。从我一直在阅读的内容来看,似乎async/ await“有时”创建了一个新线程。那么,何时创建新线程,何时不创建新线程?如果您正在处理IO完成端口,我可以看到它不必创建新线程,但否则我认为必须这样做。我想我对FromCurrentSynchronizationContext永远的理解也有些模糊。从本质上讲,我始终认为它是UI线程。

4
使用Async / Await正确尝试…捕获语法
我喜欢Async/AwaitTypescript等中提供的新功能的平坦性。但是,我不确定我是否必须await在try...catch块的外部声明要输入的变量以便以后使用,这一点我不确定。像这样: let createdUser try { createdUser = await this.User.create(userInfo) } catch (error) { console.error(error) } console.log(createdUser) // business // logic // goes // here 如果我错了,请纠正我,但是似乎最好的做法是不要在try主体中放置多行业务逻辑,所以我只剩下createdUser在块外声明,在块中分配,以及然后使用它。 在这种情况下,最佳做法是什么?

4
如何在Startup.Configure中处理异步操作?
在我的ASP.NET 5应用程序中,我想将Azure中的某些数据加载到Startup.Configure方法中的缓存中。Azure SDK仅公开异步方法。通常,调用异步方法是通过异步方法内部的await完成的,如下所示: public async Task Configure(IApplicationBuilder app, IMemoryCache cache) { Data dataToCache = await DataSource.LoadDataAsync(); cache.Set("somekey", dataToCache); // remainder of Configure method omitted for clarity } 但是,ASP.NET 5要求Configure方法返回void。我可以使用异步无效方法,但是我的理解是异步无效方法仅应用于事件处理程序(如https://msdn.microsoft.com/zh-cn/magazine/jj991977.aspx等) )。 我在想,一种更好的方法是在不等待的情况下调用异步函数,对返回的Task调用Wait,然后通过Task.Results属性缓存结果,如下所示: public void Configure(IApplicationBuilder app, IMemoryCache cache) { Task&lt;Data&gt; loadDataTask = DataSource.LoadDataAsync(); loadDataTask.Wait(); cache.Set("somekey", loadDataTask.Result); // remainder of Configure method …

6
如何编写“等待”方法?
我终于寻找到了异步及的await关键字,我有种“搞定”,但所有的例子我见过的异步调用.NET Framework中的方法,例如这一次,它调用HttpClient.GetStringAsync()。 我不太清楚的是这种方法中发生了什么,以及如何编写自己的“ awaitable”方法。它就像将要异步运行的代码包装在Task中并返回该代码一样简单吗?
70 c#  async-await 

5
+ =的异步功能
let x = 0; async function test() { x += await 5; console.log('x :', x); } test(); x += 1; console.log('x :', x); 运行代码段隐藏结果展开摘要 已x记录的值为1和5。我的问题是:为什么x 5第二个日志的值是多少? 如果在test之后执行x += 1(因为它是异步函数),则x的值在test执行时为1 ,因此x += await 5应使的值为x 6。

4
在AsyncDispose中处理异常的正确方法
在切换到新的.NET Core 3的过程中IAsynsDisposable,我偶然发现了以下问题。 问题的核心:如果DisposeAsync引发异常,则此异常隐藏await using-block 内部引发的所有异常。 class Program { static async Task Main() { try { await using (var d = new D()) { throw new ArgumentException("I'm inside using"); } } catch (Exception e) { Console.WriteLine(e.Message); // prints I'm inside dispose } } } class D : IAsyncDisposable { public …

3
为什么要继续执行Task.WhenAll的延续?
Task.WhenAll在.NET Core 3.0上运行时,我只是对该方法感到好奇。我将一个简单Task.Delay任务作为单个参数传递给Task.WhenAll,并且希望包装后的任务的行为与原始任务相同。但这种情况并非如此。原始任务的延续是异步执行的(这是理想的),多个Task.WhenAll(task)包装的延续是一个接一个地同步执行的(这是不希望的)。 这是此行为的演示。四个辅助任务正在等待同一Task.Delay任务完成,然后继续进行大量的计算(由模拟Thread.Sleep)。 var task = Task.Delay(500); var workers = Enumerable.Range(1, 4).Select(async x =&gt; { Console.WriteLine($"{DateTime.Now:HH:mm:ss.fff}" + $" [{Thread.CurrentThread.ManagedThreadId}] Worker{x} before await"); await task; //await Task.WhenAll(task); Console.WriteLine($"{DateTime.Now:HH:mm:ss.fff}" + $" [{Thread.CurrentThread.ManagedThreadId}] Worker{x} after await"); Thread.Sleep(1000); // Simulate some heavy CPU-bound computation }).ToArray(); Task.WaitAll(workers); 这是输出。四个延续在不同线程(并行)中按预期运行。 05:23:25.511 [1] Worker1 before await 05:23:25.542 …

2
用于同步迭代器的等待
MDN 说 for await...of有两个用例: 该for await...of语句创建一个循环,循环遍历异步可迭代对象以及同步可迭代对象,... 我以前知道前者:使用异步可迭代Symbol.asyncIterator。但是我现在对后者感兴趣:同步可迭代。 以下代码在一个同步可迭代对象(一个promise数组)上进行迭代。它似乎阻碍了每个诺言的实现。 async function asyncFunction() { try { const happy = new Promise((resolve)=&gt;setTimeout(()=&gt;resolve('happy'), 1000)) const sad = new Promise((_,reject)=&gt;setTimeout(()=&gt;reject('sad'))) const promises = [happy, sad] for await(const item of promises) { console.log(item) } } catch (err) { console.log(`an error occurred:`, err) } } asyncFunction() // …

1
如何在Rust中将异步函数放入地图中?
为编写异步路由器时,我无法处理异步功能hyper。 这段代码: use std::collections::HashMap; use std::future::Future; type BoxedResult&lt;T&gt; = Result&lt;T, Box&lt;dyn std::error::Error + Send + Sync&gt;&gt;; type CalcFn = Box&lt;dyn Fn(i32, i32) -&gt; dyn Future&lt;Output = BoxedResult&lt;i32&gt;&gt;&gt;; async fn add(a: i32, b: i32) -&gt; BoxedResult&lt;i32&gt; { Ok(a + b) } async fn sub(a: i32, b: i32) -&gt; BoxedResult&lt;i32&gt; { Ok(a …
11 rust  async-await 

1
从Asp.Net Core控制器返回IAsyncEnumerable <T>和NotFound
对于返回an IAsyncEnumerable&lt;T&gt;和a NotFoundResult但仍以异步方式处理的控制器操作,正确的签名是什么? 我使用了此签名,由于IAsyncEnumerable&lt;T&gt;无法等待,因此无法编译: [HttpGet] public async Task&lt;IActionResult&gt; GetAll(Guid id) { try { return Ok(await repository.GetAll(id)); // GetAll() returns an IAsyncEnumerable } catch (NotFoundException e) { return NotFound(e.Message); } } 这个编译很好,但是它的签名不是异步的。因此,我担心它是否会阻塞线程池线程: [HttpGet] public IActionResult GetAll(Guid id) { try { return Ok(repository.GetAll(id)); // GetAll() returns an IAsyncEnumerable } catch (NotFoundException e) …

1
如何使用将引用作为回调的Rust异步fn?
async fn返回实现的匿名类型Future,因此,如果我们要将其用作回调,则需要将返回值转换为trait对象。 我试图编写一个函数来执行此操作,但是我遇到了一些终身问题。 async fn将返回所有参数的生存期,因此回调的签名也需要。如何将生存期添加到回调的返回值? use futures::future::{Future, FutureExt, LocalBoxFuture}; type Context = (); type AsyncCb = Box&lt;dyn for&lt;'r&gt; FnOnce(&amp;'r Context) -&gt; LocalBoxFuture&lt;'r, ()&gt;&gt;; fn normalize_async_cb&lt;Fut: Future&lt;Output = ()&gt;&gt;(f: for&lt;'r&gt; fn(&amp;'r Context) -&gt; Fut) -&gt; AsyncCb // how to add 'r for Fut? ^^^ { let cb = move |ctx: &amp;Context| …
10 rust  async-await 

7
如何在C#中触发事件之前阻止代码流
在这里,我们有Grid一个Button。当用户单击按钮时,将执行Utility类中的方法,该方法强制应用程序接收对Grid的单击。代码流必须在此处停止,并且直到用户单击时才能继续Grid。 在此之前,我有一个类似的问题: 等到用户单击C#WPF 在这个问题中,我使用了有效的async / await得到了答案,但是由于我打算将其用作API的一部分,因此我不想使用async / await,因为消费者随后必须用我不想要的异步。 如何编写Utility.PickPoint(Grid grid)方法以实现此目标? 我看到这可能有所帮助,但说实话,我对此并不完全了解: 阻塞直到事件完成 将其视为类似于Console应用程序中的Console.ReadKey()方法的东西。当我们调用此方法时,代码流将停止,直到我们输入一些值为止。在我们输入内容之前,调试器不会继续。我想要PickPoint()方法的确切行为。代码流将停止,直到用户单击网格为止。 &lt;Window x:Class="WpfApp1.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:local="clr-namespace:WpfApp1" mc:Ignorable="d" Title="MainWindow" Height="450" Width="800"&gt; &lt;Grid&gt; &lt;Grid.RowDefinitions&gt; &lt;RowDefinition Height="3*"/&gt; &lt;RowDefinition Height="1*"/&gt; &lt;/Grid.RowDefinitions&gt; &lt;Grid x:Name="View" Background="Green"/&gt; &lt;Button Grid.Row="1" Content="Pick" Click="ButtonBase_OnClick"/&gt; &lt;/Grid&gt; &lt;/Window&gt; public partial class MainWindow : Window { public MainWindow() { …

2
在C#中委派异步行为的模式
我正在尝试设计一个类,以公开添加异步处理问题的能力。在同步编程中,这可能看起来像 public class ProcessingArgs : EventArgs { public int Result { get; set; } } public class Processor { public event EventHandler&lt;ProcessingArgs&gt; Processing { get; } public int Process() { var args = new ProcessingArgs(); Processing?.Invoke(args); return args.Result; } } var processor = new Processor(); processor.Processing += args =&gt; args.Result …

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.