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

これは、asyncおよびawaitキーワードを使用して、さまざまなプログラミング言語でサポートされている非同期プログラミングモデルをカバーしています。

5
デッドロックを引き起こす非同期/待機の例
c#のasync/ awaitキーワードを使用した非同期プログラミングのベストプラクティスに出くわしました(c#5.0は初めてです)。 与えられたアドバイスの1つは次のとおりです。 安定性:同期コンテキストを知る ...一部の同期コンテキストは非再入可能で、シングルスレッドです。つまり、コンテキスト内で一度に実行できる作業単位は1つだけです。この例は、Windows UIスレッドまたはASP.NET要求コンテキストです。これらのシングルスレッド同期コンテキストでは、自分でデッドロックするのは簡単です。シングルスレッドコンテキストからタスクを生成し、そのコンテキストでそのタスクを待つ場合、待機中のコードがバックグラウンドタスクをブロックしている可能性があります。 public ActionResult ActionAsync() { // DEADLOCK: this blocks on the async task var data = GetDataAsync().Result; return View(data); } private async Task<string> GetDataAsync() { // a very simple async method var result = await MyWebService.GetDataAsync(); return result.ToString(); } 自分で分解しようとすると、メインスレッドはで新しいスレッドにスポーンしMyWebService.GetDataAsync();ますが、メインスレッドはそこで待機しているので、で結果を待機しGetDataAsync().Resultます。一方、データの準備ができていると言います。メインスレッドが継続ロジックを継続せず、継続結果の文字列を返すのはなぜGetDataAsync()ですか? 上記の例でデッドロックが発生する理由を誰かが説明してもらえますか?私は問題が何であるかについて完全に無知です...

1
ネットワーク資格情報を含むHttpClient.GetAsync
私は現在HttpWebRequest、ウェブサイトを取得するために使用しています。に記載されていないawaitパターンを使用したいと思いHttpWebRequestsます。HttpClient新しいHttpワーカークラスと思われるクラスを見つけました。私はHttpClient.GetAsync(...)自分のWebページのクエリに使用しています。しかし、のClientCredentialsように追加するオプションがありませんHttpWebRequest.Credentials。HttpClient認証情報を提供する方法はありますか?

4
try / catch / finallyで待つための良い解決策はありますか?
次のように例外を(スタックトレースとともに)再度スローする前asyncに、catchブロック内のメソッドを呼び出す必要があります。 try { // Do something } catch { // <- Clean things here with async methods throw; } ただし、残念ながらawait、catchまたはfinallyブロックでは使用できません。それは、コンパイラーがcatchブロック内に戻ってawait命令の後にあるものを実行する方法がないためだと学びました... を使用Task.Wait()して交換しようとしたawaitところ、デッドロックが発生しました。これを回避する方法をウェブで検索して、このサイトを見つけました。 asyncメソッドを変更することも、使用するかどうかもわからないため、別のスレッドで(デッドロックを回避するために)非同期メソッドを開始し、その完了を待機するConfigureAwait(false)これらのメソッドを作成Func<Task>しました。 public static void AwaitTaskSync(Func<Task> action) { Task.Run(async () => await action().ConfigureAwait(false)).Wait(); } public static TResult AwaitTaskSync<TResult>(Func<Task<TResult>> action) { return Task.Run(async () => await action().ConfigureAwait(false)).Result; } public static void …

4
「awaitTask.Run();」の違い 戻る;」および「returnTask.Run()」?
次の2つのコードの間に概念的な違いはありますか? async Task TestAsync() { await Task.Run(() => DoSomeWork()); } そして Task TestAsync() { return Task.Run(() => DoSomeWork()); } 生成されたコードも異なりますか? 編集:との混同を避けるためTask.Runに、同様のケース: async Task TestAsync() { await Task.Delay(1000); } そして Task TestAsync() { return Task.Delay(1000); } 後期更新:受け入れられた回答に加えて、LocalCallContext処理方法にも違いがあります。非同期がない場合でも、CallContext.LogicalGetDataが復元されます。どうして?
90 c#  async-await 

4
待機後にHttpContext.Currentがnullになるのはなぜですか?
私は次のテストWebAPIコードを持っています。本番環境ではWebAPIを使用していませんが、この質問について話し合ったために作成しました。WebAPI非同期の質問 とにかく、これが問題のあるWebAPIメソッドです。 public async Task<string> Get(int id) { var x = HttpContext.Current; if (x == null) { // not thrown throw new ArgumentException("HttpContext.Current is null"); } await Task.Run(() => { Task.Delay(500); id = 3; }); x = HttpContext.Current; if (x == null) { // thrown throw new ArgumentException("HttpContext.Current is null"); …

1
Awaitは、非同期関数内の予約語エラーです
私は次の構文で問題を理解するのに苦労しています: export const sendVerificationEmail = async () => (dispatch) => { try { dispatch({ type: EMAIL_FETCHING, payload: true }); await Auth.sendEmailVerification(); dispatch({ type: EMAIL_FETCHING, payload: false })) } catch (error) { dispatch({ type: EMAIL_FETCHING, payload: false }); throw new Error(error); } }; 私は次のようにエラーを受け取り続けます: awaitは予約語です ...しかし、非同期関数内では合法ではありませんか? ディスパッチビットはreact-thunkライブラリから来ています。

5
LINQを使用して非同期でタスクのリストを待つ方法は?
このように作成したタスクのリストがあります。 public async Task<IList<Foo>> GetFoosAndDoSomethingAsync() { var foos = await GetFoosAsync(); var tasks = foos.Select(async foo => await DoSomethingAsync(foo)).ToList(); ... } を使用する.ToList()と、タスクがすべて開始されます。今、私は彼らの完成を待って、結果を返したいと思います。 これは上記の...ブロックで機能します。 var list = new List<Foo>(); foreach (var task in tasks) list.Add(await task); return list; それは私が望むことをしますが、これはかなり不器用なようです。私はむしろこのようなもっと単純なものを書きたいです: return tasks.Select(async task => await task).ToList(); ...しかし、これはコンパイルされません。何が足りないのですか?それとも、このように表現することは不可能ですか?
87 c#  linq  async-await 

4
非同期BlockingCollection <T>のようなものはありますか?
非同期awaitの結果を確認したいBlockingCollection&lt;T&gt;.Take()ので、スレッドをブロックしません。このようなものを探しています: var item = await blockingCollection.TakeAsync(); 私はこれができることを知っています: var item = await Task.Run(() =&gt; blockingCollection.Take()); しかし、ThreadPool代わりに(の)別のスレッドがブロックされるため、それはアイデア全体をやや殺します。 代替手段はありますか?

4
ループでawaitを使用する方法
コレクションに対していくつかの作業を行う非同期コンソールアプリを作成しようとしています。並列forループを使用するバージョンとasync / awaitを使用するバージョンがあります。async / awaitバージョンは並列バージョンと同様に機能することを期待していましたが、同期して実行されます。私は何が間違っているのですか? class Program { static void Main(string[] args) { var worker = new Worker(); worker.ParallelInit(); var t = worker.Init(); t.Wait(); Console.ReadKey(); } } public class Worker { public async Task&lt;bool&gt; Init() { var series = Enumerable.Range(1, 5).ToList(); foreach (var i in series) { Console.WriteLine("Starting Process {0}", …
86 c#  .net  async-await 

3
Entity Framework SaveChanges()とSaveChangesAsync()およびFind()とFindAsync()
上記の2つのペアの違いを探していましたが、それについて明確に説明している記事や、どちらを使用するかについての記事は見つかりませんでした。 だから、何の違いであるSaveChanges()とはSaveChangesAsync()? そして、の間Find()とFindAsync()? サーバー側では、Asyncメソッドを使用するときに、も追加する必要がありawaitます。したがって、サーバー側では非同期ではないと思います。 クライアント側のブラウザでUIがブロックされるのを防ぐのに役立つだけですか?それとも、それらの間に賛否両論がありますか?

5
非同期関数の外部でawaitを使用する
最初の関数には条件付きの戻りパラメーターがあり、2番目の関数が実行されるか、モジュールを終了するため、2つの非同期関数をチェーン化しようとしました。しかし、スペックでは見つけられない奇妙な振る舞いを見つけました。 async function isInLobby() { //promise.all([chained methods here]) let exit = false; if (someCondition) exit = true; } これは私のコードのろくでなしのスニペットであり(ここで全範囲を見ることができます)、プレイヤーがすでにロビーにいるかどうかをチェックするだけですが、それは関係ありません。 次に、この非同期関数があります。 async function countPlayer() { const keyLength = await scardAsync(game); return keyLength; } の場合、この関数を実行する必要はありませんexit === true。 やってみた const inLobby = await isInLobby(); これは結果を待つことを望んでいたのでinLobby、条件付きで実行するために使用できますがcountPlayer、具体的な詳細がないタイプエラーを受け取りました。 できないのはなぜあなたの関数のスコープの機能の外?私はそれが砂糖の約束であることを知っているので、それは連鎖しなければなりません、しかしなぜ私は別の約束を待つことができるのに、外では私はできないのですか?awaitasyncthencountPlayerawait isInLobby

9
キャッチブロックで待つ
私は次のコードを持っています: WebClient wc = new WebClient(); string result; try { result = await wc.DownloadStringTaskAsync( new Uri( "http://badurl" ) ); } catch { result = await wc.DownloadStringTaskAsync( new Uri( "http://fallbackurl" ) ); } 基本的にはURLからダウンロードしたいのですが、例外で失敗したら別のURLからダウンロードしたいです。もちろん、両方の時間は非同期です。ただし、コードはコンパイルされません。 エラーCS1985:catch句の本文で待機できません OK、なんらかの理由で禁止されていますが、ここでの正しいコードパターンは何ですか? 編集: 幸いなことに、C#6.0では、catchとfinallyブロックの両方で待機呼び出しが許可される可能性があります。

5
WindowsストアアプリでCoreDispatcherを取得する正しい方法
Windowsストアアプリを構築していますが、UIスレッドに投稿する必要のあるコードがいくつかあります。 そのために、CoreDispatcherを取得し、それを使用してコードを投稿したいと思います。 これを行うにはいくつかの方法があるようです。 // First way Windows.ApplicationModel.Core.CoreApplication.GetCurrentView().CoreWindow.Dispatcher; // Second way Window.Current.Dispatcher; どちらが正しいのだろうか?または両方が同等である場合?

5
新しいC#待機機能は何をしますか?[閉まっている]
クローズ。この質問はもっと焦点を合わせる必要があります。現在、回答を受け付けていません。 この質問を改善したいですか?質問を更新して、この投稿を編集するだけで1つの問題に焦点を当てるようにします。 4年前に閉鎖されました。 この質問を改善する await関数が何をするのか誰かが説明できますか?
83 c#  c#-5.0  async-await 

6
タスクの同期継続を防ぐにはどうすればよいですか?
にTask基づいて、リクエストへの保留中の応答にベースのAPIを提供するライブラリ(ソケットネットワーク)コードがありますTaskCompletionSource&lt;T&gt;。ただし、同期継続を防ぐことは不可能であるように思われるという点で、TPLには煩わしさがあります。私はなりたいと行うことができるようにすることのいずれかです: TaskCompletionSource&lt;T&gt;発信者が、、TaskContinuationOptions.ExecuteSynchronouslyまたはで接続することを許可してはならないことを伝えます 代わりにプールを使用して、無視する必要があることを指定する方法で結果(SetResult/ TrySetResult)を設定しTaskContinuationOptions.ExecuteSynchronouslyます 具体的には、私が抱えている問題は、受信データが専用のリーダーによって処理されており、発信者が接続できる場合TaskContinuationOptions.ExecuteSynchronously、リーダーをストールさせる可能性があることです(これはそれらだけに影響を与えるだけではありません)。以前、私はかどうかを検出することをいくつかの牛車でこれを回避働いている任意の継続が存在し、それらがある場合、それはへの完了を押してThreadPool完了が処理されませうとして、発信者が、自分の仕事のキューを飽和している場合は、しかし、これは重大な影響を持っていますタイムリーに。彼らが使用しているTask.Wait()(または同様の)場合、彼らは本質的に彼ら自身をデッドロックさせます。同様に、これが、リーダーがワーカーを使用するのではなく、専用のスレッドを使用している理由です。 そう; TPLチームを悩ませる前に:オプションがありませんか? キーポイント: 外部の発信者が自分のスレッドを乗っ取れるようにしたくない ThreadPoolプールが飽和状態のときに機能する必要があるため、実装として使用することはできません 以下の例では、出力が生成されます(順序はタイミングによって異なる場合があります)。 Continuation on: Main thread Press [return] Continuation on: Thread pool 問題は、ランダムな呼び出し元が「メインスレッド」で継続を取得できたという事実です。実際のコードでは、これはプライマリリーダーを中断します。悪いこと! コード: using System; using System.Threading; using System.Threading.Tasks; static class Program { static void Identify() { var thread = Thread.CurrentThread; string name = thread.IsThreadPoolThread ? "Thread pool" : thread.Name; …

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.