1. ホーム
  2. c#

[解決済み] 非ジェネリックなTaskCompletionSourceまたは代替品

2023-07-06 20:48:44

質問

私はアラートウィンドウ (Telerik WPF) を使用していますが、通常は非同期で表示されます (開かれている間、コードは実行され続けます) が、それを async/await を使用して同期にしたいのです。

私はこれを次のように動作させています。 TaskCompletionSource のようなオブジェクトを返しますが、このクラスは一般的で Task<bool> のようなオブジェクトを返してきますが、私が欲しいのは単なる Task であり、戻り値はない。

public Task<bool> ShowAlert(object message, string windowTitle)
{
    var dialogParameters = new DialogParameters { Content = message };

    var tcs = new TaskCompletionSource<bool>();
    dialogParameters.Closed += (s, e) => tcs.TrySetResult(true);

    RadWindow.Alert(dialogParameters);

    return tcs.Task;
}

そのメソッドを呼び出すコードは

await MessageBoxService.ShowAlert("The alert text.")

を待つことができる、似たような機能を持つ汎用的でないタスクを返すにはどうしたらよいでしょうか? dialogParameters.Closed イベントが発生するまで待つことができます。 を無視することができることは理解しています。 bool を無視することができるのは理解できますが、このコードで返されている 私はそれとは異なる解決策を探しています。

どのように解決するのですか?

メソッドを変更することができます。

public Task ShowAlert(object message, string windowTitle)

Task<bool> を継承しています。 Task を継承しているので Task<bool> を返す一方で Task を呼び出し元に対してのみ公開します。

編集してください。

マイクロソフトのドキュメントを見つけました。 http://www.microsoft.com/en-us/download/details.aspx?id=19957 Stephen Toub による 'The Task-based Asynchronous pattern' というタイトルの Microsoft ドキュメントを見つけ、これと同じパターンを推奨する以下の抜粋を掲載しました。

TaskCompletionSource<TResult> に対応する非ジェネリックなものは存在しない。 しかし、Task<TResult> は Task から派生するため、ダミーの TResult (Boolean は良いデフォルト選択で、開発者が Task の消費者が Task<TResult> にダウンキャストすることを懸念する場合、プライベート TResult タイプが使用されるかもしれません)を持つソースを使って単に Task を返す I/O バウンドのメソッドのために使用することが可能です。