如何跟踪异步/等待任务是否正在运行

我正在尝试从基于事件的异步模式转换,我使用唯一的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并查看该异步方法和.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(); } } 

async / await本身旨在用于创建从UI线程异步执行的顺序操作。 您可以让它执行并行操作,但通常操作会以某种结果“连接”回UI线程。 (还有可能在await时进行“即发即忘”类型的异步操作,但不建议这样做)。 即async / await没有任何固有的支持进度报告。

可以使用async / await从代码中获得进展; 但是你需要使用像IProgress这样的新进度界面。 有关使用async / await进行报告的更多信息,请参阅http://blogs.msdn.com/b/dotnet/archive/2012/06/06/async-in-4-5-enabling-progress-and-cancellation- in-async-apis.aspx 。 迁移到此应该只是调用IProgress委托而不是Progress事件。

如果您正在使用您创建的Task ,则可以检查任务的状态属性(或者如果完成是您感兴趣的唯一状态,则只需查看Task.IsCompleted )。

话虽这么说, await将不会“返回”,直到操作完成,引发exception或取消。 你基本上可以安全地假设,如果你还在等待“等待”,你的任务还没有完成。

 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 ** } 

额外的好处是你可以看到队列中有多少物品!