How to track if an async/awaitable task is running

后端 未结 3 1649
执笔经年
执笔经年 2020-12-17 18:14

I\'m trying to transition from the Event-based Asynchronous Pattern where I tracked running methods using unique id\'s and the asynoperationmanager.
As this has now bee

相关标签:
3条回答
  • 2020-12-17 18:32

    async/await itself is intended to be used to create sequential operations executed asynchronously from the UI thread. You can get it to do parallel operations, but generally the operations "join" back to the UI thread with some sort of result. (there's also the possibility of doing "fire-and-forget" types of asynchronous operations with await but it's not recommended). i.e. there's nothing inherent to async/await to support progress reporting.

    You can get progress out of code using async/await; but you need to use new progress interfaces like IProgress<T>. For more info on progress reporting with async/await, see http://blogs.msdn.com/b/dotnet/archive/2012/06/06/async-in-4-5-enabling-progress-and-cancellation-in-async-apis.aspx. Migrating to this should just be a matter of calling an IProgress delegate instead of a Progress event.

    0 讨论(0)
  • 2020-12-17 18:37

    If you're using a Task you've created, you can check the Task's Status property (or just see Task.IsCompleted if completion is the only state you are interested in).

    That being said, await will not "return" until the operation either completes, raises an exception, or cancels. You can basically safely assume that, if you're still waiting on the "await", your task hasn't completed.

    0 讨论(0)
  • 2020-12-17 18:37
    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 **
    }
    

    The added bonus is that you can see how many items are sitting in the queue!

    0 讨论(0)
提交回复
热议问题