タグ付けされた質問 「async-await」

これは、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 52番目のログの値は何ですか? が(非同期関数であるため)のtest後に実行された場合、x += 1xの値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)ラッパーの継続は1つずつ同期して実行されます(これは望ましくありません)。 ここでデモこの動作のは。4つのワーカータスクが同じTask.Delayタスクが完了するのを待ってから、重い計算(でシミュレートThread.Sleep)を続行します。 var task = Task.Delay(500); var workers = Enumerable.Range(1, 4).Select(async x => { 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); これが出力です。4つの継続は、異なるスレッドで(並列に)期待どおりに実行されています。 05:23:25.511 [1] Worker1 before await 05:23:25.542 …

2
同期イテラブルでの待機に使用する
MDNによると for await...of、2つのユースケースがあります。 このfor await...ofステートメントは、非同期反復可能オブジェクトだけでなく、同期反復可能オブジェクトに対してもループするループを作成します... 私は以前に前者を知っていました:を使用しSymbol.asyncIteratorた非同期反復可能オブジェクト。しかし、今は後者に興味があります。同期イテラブルです。 次のコードは、同期イテラブル(promiseの配列)を反復処理します。それは、各約束の履行の進展を妨げるように見えます。 async function asyncFunction() { try { const happy = new Promise((resolve)=>setTimeout(()=>resolve('happy'), 1000)) const sad = new Promise((_,reject)=>setTimeout(()=>reject('sad'))) const promises = [happy, sad] for await(const item of promises) { console.log(item) } } catch (err) { console.log(`an error occurred:`, err) } } asyncFunction() // "happy, …

1
Rustのマップに非同期関数を挿入するにはどうすればよいですか?
の非同期ルーターを作成するときに、非同期機能を処理できませんhyper。 このコード: use std::collections::HashMap; use std::future::Future; type BoxedResult<T> = Result<T, Box<dyn std::error::Error + Send + Sync>>; type CalcFn = Box<dyn Fn(i32, i32) -> dyn Future<Output = BoxedResult<i32>>>; async fn add(a: i32, b: i32) -> BoxedResult<i32> { Ok(a + b) } async fn sub(a: i32, b: i32) -> BoxedResult<i32> { Ok(a …
11 rust  async-await 

1
Asp.NetコアコントローラーからIAsyncEnumerable <T>およびNotFoundを返す
IAsyncEnumerable&lt;T&gt;and を返すが、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 async fnの使用方法
async fnはを実装する匿名型を返すFutureため、それをコールバックとして使用する場合は、戻り値を特性オブジェクトに変換する必要があります。 これを行う関数を作成しようとしましたが、いくつかの寿命の問題がありました。 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。 私はここまでに同様の質問をしました: ユーザーがC#WPFをクリックするまで待ちます その質問では、動作するasync / awaitを使用して回答を得ましたが、これをAPIの一部として使用するので、コンシューマーは自分のメソッドを非同期は必要ありません。 Utility.PickPoint(Grid grid)この目標を達成するためのメソッドをどのように記述しますか? 私はこれを助けるかもしれないが、正直に言うとここに適用することを完全には理解していませんでした: イベントが完了するまでブロックする コンソールアプリケーションの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() { InitializeComponent(); } …

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 …

3
別のタスクを待つ開始されていないタスクを宣言する方法は?
私はこの単体テストを実行しましたが、「await Task.Delay()」が待機しない理由がわかりません! [TestMethod] public async Task SimpleTest() { bool isOK = false; Task myTask = new Task(async () =&gt; { Console.WriteLine("Task.BeforeDelay"); await Task.Delay(1000); Console.WriteLine("Task.AfterDelay"); isOK = true; Console.WriteLine("Task.Ended"); }); Console.WriteLine("Main.BeforeStart"); myTask.Start(); Console.WriteLine("Main.AfterStart"); await myTask; Console.WriteLine("Main.AfterAwait"); Assert.IsTrue(isOK, "OK"); } ユニットテストの出力は次のとおりです。 これはどのようにして「待機」が待機せず、メインスレッドが継続するのでしょうか。

1
なぜTask.Run()がUIスレッド/オリジンコンテキストに同期するのを待たないのですか?
非同期待ちのパターンとTask.Run動作は理解できたと思いました。 しかし、次のコード例でawait、完了したタスクから戻った後、なぜUIスレッドに同期しないのかと思います。 public async Task InitializeAsync() { Console.WriteLine($"Thread: {Thread.CurrentThread.ManagedThreadId}"); // "Thread: 1" double value = await Task.Run(() =&gt; { Console.WriteLine($"Thread: {Thread.CurrentThread.ManagedThreadId}"); // Thread: 6 // Do some CPU expensive stuff double x = 42; for (int i = 0; i &lt; 100000000; i++) { x += i - Math.PI; } …

4
非同期関数で複数の待機を処理する方法
APIを介してフェッチし、APIを介してDBにデータを書き込み、別のAPIを介してフロントエンドに出力を送信する複数のAPI呼び出しを行う必要があります。 以下のようにawaitを使用して非同期関数を作成しました- 最初の2つは次々に実行する必要がありますが、3つ目は独立して実行でき、最初の2つのフェッチステートメントが完了するのを待つ必要はありません。 let getToken= await fetch(url_for_getToken); let getTokenData = await getToken.json(); let writeToDB = await fetch(url_for_writeToDB); let writeToDBData = await writeToDB.json(); let frontEnd = await fetch(url_for_frontEnd); let frontEndData = await frontEnd.json(); そのような複数のフェッチ文を処理する最良の方法は何ですか?

2
非同期コード、シェア変数、スレッドプールスレッド、スレッドセーフ
async / awaitを使用して非同期コードを作成するとき、通常ConfigureAwait(false)はコンテキストのキャプチャを回避するために、コードがスレッドプールスレッドから次のスレッドプールスレッドにジャンプしていawaitます。これにより、スレッドの安全性に関する懸念が生じます。このコードは安全ですか? static async Task Main() { int count = 0; for (int i = 0; i &lt; 1_000_000; i++) { Interlocked.Increment(ref count); await Task.Yield(); } Console.WriteLine(count == 1_000_000 ? "OK" : "Error"); } 変数iは保護されておらず、複数のスレッドプールスレッド*によってアクセスされます。アクセスのパターンは非並行ですが、理論的には各スレッドがローカルにキャッシュされた値をインクリメントiして、1,000,000回を超える反復が可能になるはずです。しかし、実際にはこのシナリオを作成することはできません。上記のコードは、私のマシンでは常にOKを印刷します。これは、コードがスレッドセーフであることを意味しますか?またはi、lock?を使用して変数へのアクセスを同期する必要があります。 (*私のテストによれば、スレッドの切り替えは平均して2回の反復ごとに発生します)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.