2015-10-15 33 views
0

我們正在運行一個ASP.NET WebAPI 2服務,我們想用記錄器將一些請求記錄到電子郵件/數據庫。QueueBackgroundWorkItem是否實際排隊後臺工作?

因爲它是後臺工作,並且因爲在asp.net中我想我們應該使用HostingEnvironment.QueueBackgroundWorkItem在後臺運行它。

我希望我的日誌全部按順序排列 - 令我驚訝的是我找不到任何指示QueueBackgroundWorkItem實際上確保排隊的工作項順序運行或指示它不運行的任何事情。

所以,我的問題是:QueueBackgroundWorkItem保證按順序執行排隊工作嗎?

HostingEnvironment.QueueBackgroundWorkItem((e) => Console.WriteLine("A")); 
HostingEnvironment.QueueBackgroundWorkItem((e) => Console.WriteLine("B")); 

難道我知道,上面的代碼的輸出始終是:

A 
B 

或者也可以不按順序?這項工作排隊

+0

我認爲你應該使用'Queue'對象爲你的目的 –

+0

爲什麼你在第一次使用QBWI?如果您的主機決定回收,並且由於某種原因,操作未完成30秒,則會終止它。不要使用它。 [Additional Information here](http://blog.stephencleary.com/2014/06/fire-and-forget-on-asp-net.html)。如果你真的想要基於隊列的任務機制 - 你必須自己實現它。 –

+0

@RoyiNamir 30秒比我需要的多得多,它支持取消。失敗總是計算中的一個選項,我只是看着取消令牌,當我看到它時,我會將消息推入隊列中。 –

回答

1

在文檔中似乎沒有合同。

看看參考源,它似乎使用一個名爲BackgroundWorker的類來實際執行這些任務。

反過來,這似乎是並行的ThreadPool,並明確可以執行多個任務運行的任務:

public void ScheduleWorkItem(Func<CancellationToken, Task> workItem) { 
     Debug.Assert(workItem != null); 

     if (_cancellationTokenHelper.IsCancellationRequested) { 
      return; // we're not going to run this work item 
     } 

     // Unsafe* since we want to get rid of Principal and other constructs specific to the current ExecutionContext 
     ThreadPool.UnsafeQueueUserWorkItem(state => { 
      lock (this) { 
       if (_cancellationTokenHelper.IsCancellationRequested) { 
        return; // we're not going to run this work item 
       } 
       else { 
        _numExecutingWorkItems++; 
       } 
      } 

      RunWorkItemImpl((Func<CancellationToken, Task>)state); 
     }, workItem); 
    } 

所以我會說這是不安全承擔什麼二階排隊任務什麼將完成英寸

0

QueueBackgroundWorkItem保證被爲了

借鑑HostingEnvironment.QueueBackgroundWorkItem

新HostingEnvironment.QueueBackgroundWorkItem方法,讓您安排小背景的工作項目執行。 ASP.NET跟蹤這些項目,並防止IIS突然終止工作進程,直到完成所有後臺工作項目。這些將使ASP.NET應用程序能夠可靠地調度異步工作項目。

+1

我沒有在該引用中看到任何內容,也沒有在整篇文章中指出執行任務的*命令*,這似乎是該問題的要點。 –

+0

@Damien_The_Unbeliever QueueBackgroundWorkItem將執行與隊列任務相同的方式。它取決於任務的順序 – Manraj