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

Oli*_*Oli 11 .net c#

我正在尝试从基于事件的异步模式转换,我使用唯一的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
        }            
    }
}
Run Code Online (Sandbox Code Playgroud)

我正在努力的部分是找出方法是否正在运行.我已经尝试创建一个Task并查看as和异步方法的.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();
        }
    }
Run Code Online (Sandbox Code Playgroud)

Pet*_*hie 7

async/ await本身旨在用于创建从UI线程异步执行的顺序操作.您可以让它执行并行操作,但通常操作会"加入"到具有某种结果的UI线程.(还有可能使用"即发即弃"类型的异步操作,await但不推荐).也就是说,没有任何固有的async/ await支持进度报告.

可以使用async/ 获取代码的进度await; 但你需要使用新的进度界面IProgress<T>.有关使用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事件.

  • 仅仅因为Async中的方法结束并不意味着您必须使用`await`.你可以简单地使用结果`Task`并做任何你想做的事情,比如ContinueWith.例如`webClient.DownloadStringAsync(myUri).ContinueWith(t => Trace.WriteLine("done"));`--no`await`. (3认同)