問題タブ [taskcompletionsource]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
2 に答える
816 参照

c# - 任意のタスクを強制的に親にアタッチする

親にアタッチされたタスクを作成する拡張メソッドを作成しようとしています。

延長コード:

テストコード:

親タスクは、内部タスクの完了を待たずにすぐにキャンセルされます。入力として、親ディスパッチャータスクで実行しているタスクを取得しています。親にアタッチされたタスクを実行したい。

0 投票する
2 に答える
293 参照

c# - Async/Await で使用するために、イベント ベースの非同期パターンを使用するライブラリをラップする

コード全体で async/await パターンを使用しています。ただし、イベント ベースの非同期パターンを使用する API が 1 つあります。MSDN といくつかの StackOverflow の回答を読みましたが、これを行う方法は TaskCompletionSource を使用することです。

私のコード:

そして次のように呼ばれます:

または、テスト用:

メソッドは常に非常に迅速に戻りますが、どちらのイベントもトリガーされません。

tcs.Task.Await(); を追加すると return ステートメントの直前では機能しますが、これは私が望む非同期動作を提供しません。

インターネットで見たさまざまなサンプルと比較しましたが、違いはわかりません。

0 投票する
2 に答える
388 参照

c# - ConfigureAwait(false)のTaskCompletionSource.Task内で同期コンテキスト/タスクスケジューラを別のものに置き換える方法は?

そのようなメソッドを含むライブラリを作成したとします:

私のlibのすべてのユーザーは、MyLibraryMethodAsyncこのように呼び出すことができます

ここで問題が発生します。呼び出しVeryLongRunningMethod内で実行されるため、長時間taskCompletionSource.SetResult(null)ブロックされます。これは、コード (作業項目) の小さな部分を実行することを目的としているため、望ましくない動作です。workerThreadworkerThread

コンテキスト/スケジューラを、返されたタスク内のスレッド プールに置き換えて、スレッド プールではなくスレッド プールawait x.ConfigureAwait(false)で続行するにはどうすればよいですか?workerThread

私が見つけた現在の解決策は

ただし、オーバーヘッドが発生するため、好きではありません。よりエレガントなソリューションが存在する可能性がありますか?

0 投票する
1 に答える
442 参照

xamarin - タイムアウト xamarin フォームを使用して API から void メソッドを呼び出す taskcompletionsource をキャンセルする

私はこの非非同期の Task> を持っていますが、これは単に要求するだけです:

はい、わかっています、特別なことは何もありません。

clientMobile.FindItemsAsync(SetSearchParam(searchString, 100))

void メソッドの呼び出しです。このメソッドは、いくつかのパラメータを設定する別の void メソッドを呼び出してから、非同期操作を実行してアイテムのリストを返す非同期メソッドを呼び出す非同期メソッドを呼び出します。

問題は、上記のこのタスクの範囲を超えて何も制御できないことです.私の仕事をそれに適応させるのが私のポリシーなので... -_-

そのためには、FindItemsAsync へのこの呼び出しを強制終了する必要があります。合計 1 分が経過するとすぐに...上記のタイムスパンをそれぞれ 1 分に設定してみました (最初は機能しましたが、いくつかの変更が加えられました)。だめ)、半分の時間に減らしてみましたが、だめでした...

このタスクを呼び出すコードは次のとおりです。

以下は、このタスクの呼び出し元を呼び出すコードです...(なんて混乱-_-):

現時点では、MVVM アーキテクチャを実装しようとしています...

本当に、この件に関してご協力いただきありがとうございます。大変お世話になりました。ご迷惑をおかけして本当に申し訳ありません...

編集

私の目的を明確に説明していなかったため、申し訳ありません。つまり、void メソッド FindItemsAsync を介して通信するだけの API にアクセスするアイテムのリストを取得する必要があります。これらすべてのアイテムを取得するのに 60 秒かかります。何か問題が発生した場合、またはタイムアウトした場合は、プロセスをキャンセルして、問題が発生したことをユーザーに通知する必要があります。

そんなことはありません。キャンセルすることはありません。アイテムを取得するか、永遠にロードし続けるかのどちらかです...私はタスクとこのようなもののほとんどに慣れていないため、常に問題が発生します...