我有一個代碼塊正在讀隊列,處理一個項目(在它自己的線程中),然後重複,直到隊列爲空。無法理解爲什麼我得到一個NullReferenceException
public ActionResult GetOrdersAsync() {
int count = 0;
SyncDM sync = _common.StartSync();
while (sync != null && sync.SyncId != 0) {
int customerId;
bool result = int.TryParse(sync.Payload, out customerId);
if (result) {
Task.Run(() => GetOrders(sync.SyncId, customerId));
}
count++;
//Process the next Sync
sync = _common.StartSync();
}
return Json(new JsonModel {
Message = "Started " + count + " instances of GetOrders",
Success = count > 0
});
}
StartSync()從隊列中刪除一個項目,或者如果隊列爲空則返回null。 GetOrders()處理對象。
問題是有時代碼會在此行上引發NullReferenceException Task.Run(()=> GetOrders(sync.SyncId,customerId));
在調試器中,Sync是null
(原因是異常),但customerId有一個值。這告訴我同步在前一行有一個值。這讓我感到困惑,我認爲它與Task.Run和線程有關,但我不明白本地作用域變量是如何自發地改變它的值的。
如果您的同步= _common.StartSync()之前GetOrders和(無效您的同步對象)完成後,它有道理爲什麼會這樣做。您可以將GetOrders和GetOrdersAsync()作爲實際的異步方法,然後等待GetOrders?它會在嘗試處理下一個同步之前等待。 – Dispersia