13

一意の ID と asynoperationmanager を使用して実行中のメソッドを追跡したイベント ベースの非同期パターンから移行しようとしています。
これは Windows 8 アプリから削除されたため、Async/Await で同様の効果を得ようとしていますが、その方法がわかりません。
私が達成しようとしているのは、次のようなものです

private async Task updateSomething()
{
    if(***the method is already running***)
    {
        runagain = true;
    }
    else
    {
        await someMethod();
        if (runagain)
        {
            run the method again
        }            
    }
}

私が苦労している部分は、メソッドが実行されているかどうかを調べることです。Task を作成して、それと async メソッドの .status の両方のステータスを調べてみましたが、正しい場所ではないようです。ありがとう

更新: これは、同じ結果を得るために .net 4 で使用している現在のコードです。_updateMetaDataAsync は、イベント ベースの非同期パターンに基づくクラスです。

private void updateMetaData()
    {
        if (_updateMetaDataAsync.IsTaskRunning(_updateMetaDataGuid_CheckAllFiles))
        {
            _updateMetaDataGuid_CheckAllFiles_Again = true;
        }
        else
        {
            _updateMetaDataGuid_CheckAllFiles_Again = false;
            _updateMetaDataAsync.UpdateMetaDataAsync(_updateMetaDataGuid_CheckAllFiles);
        }
    }

private void updateMetaDataCompleted(object sender, UpdateMetaDataCompletedEventArgs e)
    {
        if (_updateMetaDataGuid_CheckAllFiles_Again)
        {
            updateMetaData();
        }
    }
4

3 に答える 3

8

async/await自体は、UIスレッドから非同期で実行される順次操作を作成するために使用することを目的としています。並列操作を実行するように設定できますが、通常、操作はUIスレッドに「参加」して、ある種の結果をもたらします。(で「ファイアアンドフォーゲット」タイプの非同期操作を実行する可能性もありますawaitが、お勧めしません)。つまり、進捗レポートをサポートするためにasync/に固有のものは何もありません。await

/ ;を使用してコードの進捗状況を取得できます。ただし、のような新しい進行状況インターフェイスを使用する必要があります。/を使用した進捗レポートの詳細については、 http://blogs.msdn.com/b/dotnet/archive/2012/06/06/async-in-4-5-enabling-progress-and-cancellation-in-を参照してください。 async-apis.aspx。これに移行するには、イベントではなく代理人を呼び出すだけです。asyncawaitIProgress<T>asyncawaitIProgressProgress

于 2012-08-23T20:27:42.373 に答える
3

作成した を使用しているTask場合は、Task のStatusプロパティを確認できます (または、必要な状態が完了だけである場合はTask.IsCompletedを参照してください)。

そうは言ってもawait、操作が完了するか、例外が発生するか、キャンセルされるまで、「戻り」ません。基本的に、「待機」をまだ待っている場合は、タスクが完了していないと安全に想定できます。

于 2012-08-23T18:56:33.840 に答える
0
SemaphoreSlim queueToAccessQueue = new SemaphoreSlim(1);
object queueLock = new object();
long queuedRequests = 0;
Task _loadingTask;
public void RetrieveItems() {
  lock (queueLock) {
      queuedRequests++;
      if (queuedRequests == 1) { // 1 is the minimum size of the queue before another instance is queued
        _loadingTask = _loadingTask?.ContinueWith(async () => {
          RunTheMethodAgain();
          await queueToAccessQueue.WaitAsync();
          queuedRequests = 0; // indicates that the queue has been cleared;
          queueToAccessQueue.Release()
        }) ?? Task.Run(async () => {
          RunTheMethodAgain();
          await queueToAccessQueue.WaitAsync();
          queuedRequests = 0; // indicates that the queue has been cleared;
          queueToAccessQueue.Release();
        });
      }
  }
}
public void RunTheMethodAgain() {
  ** run the method again **
}

追加のボーナスは、キューにあるアイテムの数を確認できることです!

于 2015-07-17T04:39:47.260 に答える