Task <T>を使用してイベントを発生させ、イベントが終了するのを待つ方法

ShaffDaddy

次のシナリオがあります。

  1. Webサービスの開始を要求しているクライアント

    public bool Start(MyProject project, string error)
    
  2. メソッドでクライアントからの呼び出しを受信するWebサービス

    public event EventHandler<StartEventArgs> startEvent;
    
    public bool Start(MyProject project, string error)
    {
        Task<bool> result = StartAsync(project, error);
    
        return result.Result;
    }
    
    protected virtual void OnStart(StartEventArgs e)
    {
        // thread safe trick, snapshot of event
        var se = startEvent;
        if (se != null)
        {
            startEvent(this, e);
        }
    }
    
    private Task<bool> StartAsync(MyProject project, string error)
    {
        var taskCompletion = new TaskCompletionSource<bool>();
    
        this.startEvent += (p, e) => taskCompletion.TrySetResult((e.Error == string.Empty) ? true : false);
    
        this.OnStart(new StartEventArgs(project, error));
    
        return taskCompletion.Task;
    }
    
  3. Webサービスにあるイベントをサブスクライブしているアプリケーション:

    app.Start += EventHandler(App_Start)
    
    private bool App_Start()
    {
       // does something
       returns true/false
    }
    
  4. Webサービスでタスクのイベントを発生させ、app.exeの関数が終了するのを待ってから、ここに戻ってタスクが正常に完了したことをユーザーに通知します。

これを行う方法はわかりませんが、理論的には次のようになります。

Task<bool> startTask = Task.Factory.StartNew(() => { OnStart() });
startTask.WaitAll(); // I think this is what I would need to for 4.0
return startTask.Result

私がやろうとしていることを誰かが見ることができるように、私が十分に説明的であることを願っています。サービスがクライアントについて何も知る必要がなく、タスクを実行するだけで、イベントの実行が終了したら、このポイントに戻って、成功/失敗を表すブール値をクライアントに返す必要があります。

これは可能ですか、それとも私はこれで本当に間違ったアプローチを取っていますか?

更新:明らかにOnStartはイベントではないので、あなたが私に説明しようとしていることをどのように行うのですか?

リードコプシー

イベントベースの非同期パターンを説明するイベントをTask<T>viaにラップできTaskCompletionSource<T>ます。基本的なパターンは通常、次のようなものです。

Task<bool> StartAsync()
{
    var tcs = new TaskCompletionSource<bool>();

    // When the event returns, set the result, which "completes" the task
    service.OnStarted += (o,e) => tcs.TrySetResult(e.Success);

    // If an error occurs, error out the task (optional)
    service.OnStartError += (o,e) => tcs.TrySetException(e.Exception);

    // Start the service call
    service.Start();

    // Return the Task<T>
    return tcs.Task;
}

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

Task <T>を使用してイベントを発生させ、イベントが終了するのを待つ方法

分類Dev

イベントAction <T>を使用してイベントを発生させる

分類Dev

所有するクラス内の `List <T>`の `T`のプロパティに変更が発生したときにイベントを実装して発生させる方法

分類Dev

Task <T>がタイムアウトで完了するのを非同期的に待機します

分類Dev

Javafx Task <ObserveableList> .updateValueは、最初の変更イベントのみを発生させます

分類Dev

Javaの所有クラス内の `List <T>`の `T`のプロパティに変更が発生したときにイベントを実装して発生させる方法

分類Dev

待たずにTask <T>を返す方法

分類Dev

Task <T>からTを取得する

分類Dev

Task <object>をTask <T>に変換します。Tは不明です。

分類Dev

イベントが発生したときに日付範囲を識別するT-SQLクエリ

分類Dev

イベントが発生した後にTask.Delay()をリセットするにはどうすればよいですか?

分類Dev

void、Task、またはTask <T>を返さないメソッドで何かを待つ適切な方法は?

分類Dev

Task <T>をTにキャストする

分類Dev

async / awaitなしでTask <T>を非同期的に待機します

分類Dev

待機を含むメソッドからTask.FromResult <T>(T result)を使用するのはなぜですか?

分類Dev

Func <Task <T >>構文の使用方法は?

分類Dev

ビルド前のイベントコマンドラインを使用してパラメータをT4テンプレートに渡す方法

分類Dev

async / awaitを削除するとTask <T>からTask <object>への変換エラーが発生するのはなぜですか

分類Dev

WebAPIコントローラーでTask <ActionResult <IEnumerable <T >>>の代わりにIAsyncEnumerable <T>を使用できますか(または使用する必要があります)

分類Dev

Tを持たないC#でTask <T>をTask <object>にキャストする

分類Dev

TaskとTask <T>は交換可能ですか?

分類Dev

List <Task <T >>を多態的に処理して例外を処理する方法

分類Dev

Task.ContinueWith()をイベント「TaskEnded」の形式として使用することは良い習慣と考えられていますか?

分類Dev

Task <T>が完了するまでコルーチンを一時停止する正しい方法

分類Dev

Windows Task Scheduler, run task if task isn't running?

分類Dev

.NET Core / .NETStandardでのTask <T>の再利用

分類Dev

'Task <IList <T >>'を 'IList <T>'に変換します

分類Dev

2つのイベントを遅延させて発生させる方法

分類Dev

追加の例外処理を伴う非同期Task <T>のタイムアウト

Related 関連記事

  1. 1

    Task <T>を使用してイベントを発生させ、イベントが終了するのを待つ方法

  2. 2

    イベントAction <T>を使用してイベントを発生させる

  3. 3

    所有するクラス内の `List <T>`の `T`のプロパティに変更が発生したときにイベントを実装して発生させる方法

  4. 4

    Task <T>がタイムアウトで完了するのを非同期的に待機します

  5. 5

    Javafx Task <ObserveableList> .updateValueは、最初の変更イベントのみを発生させます

  6. 6

    Javaの所有クラス内の `List <T>`の `T`のプロパティに変更が発生したときにイベントを実装して発生させる方法

  7. 7

    待たずにTask <T>を返す方法

  8. 8

    Task <T>からTを取得する

  9. 9

    Task <object>をTask <T>に変換します。Tは不明です。

  10. 10

    イベントが発生したときに日付範囲を識別するT-SQLクエリ

  11. 11

    イベントが発生した後にTask.Delay()をリセットするにはどうすればよいですか?

  12. 12

    void、Task、またはTask <T>を返さないメソッドで何かを待つ適切な方法は?

  13. 13

    Task <T>をTにキャストする

  14. 14

    async / awaitなしでTask <T>を非同期的に待機します

  15. 15

    待機を含むメソッドからTask.FromResult <T>(T result)を使用するのはなぜですか?

  16. 16

    Func <Task <T >>構文の使用方法は?

  17. 17

    ビルド前のイベントコマンドラインを使用してパラメータをT4テンプレートに渡す方法

  18. 18

    async / awaitを削除するとTask <T>からTask <object>への変換エラーが発生するのはなぜですか

  19. 19

    WebAPIコントローラーでTask <ActionResult <IEnumerable <T >>>の代わりにIAsyncEnumerable <T>を使用できますか(または使用する必要があります)

  20. 20

    Tを持たないC#でTask <T>をTask <object>にキャストする

  21. 21

    TaskとTask <T>は交換可能ですか?

  22. 22

    List <Task <T >>を多態的に処理して例外を処理する方法

  23. 23

    Task.ContinueWith()をイベント「TaskEnded」の形式として使用することは良い習慣と考えられていますか?

  24. 24

    Task <T>が完了するまでコルーチンを一時停止する正しい方法

  25. 25

    Windows Task Scheduler, run task if task isn't running?

  26. 26

    .NET Core / .NETStandardでのTask <T>の再利用

  27. 27

    'Task <IList <T >>'を 'IList <T>'に変換します

  28. 28

    2つのイベントを遅延させて発生させる方法

  29. 29

    追加の例外処理を伴う非同期Task <T>のタイムアウト

ホットタグ

アーカイブ