У меня есть блок кода, который читается из очереди, обрабатывает один элемент (в собственном потоке), а затем повторяется до тех пор, пока очередь не будет пуста.Не могу понять, почему я получаю исключение 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() либо удаляет элемент из очереди, или возвращает нулевое значение, если очередь пуста. GetOrders() обрабатывает объект.
Проблема в том, что иногда код вызывает исключение NullReferenceException в этой строке Task.Run (() => GetOrders (sync.SyncId, customerId));
В отладчике синхронизация null
(причина для исключения), но customerId имеет значение. Это говорит мне, что синхронизация имела значение в предыдущей строке. Это меня сбивает с толку, я думаю, что это имеет какое-то отношение к Task.Run и threading, но я не понимаю, как локально ограниченная переменная спонтанно меняет свою ценность.
Если синхронизация = _common.StartSync() аннулирует ваш объект синхронизации до и из GetOrders() заканчивает, его имеет смысл, почему он это сделает. Можете ли вы сделать GetOrders и GetOrdersAsync() реальными методами async, а затем ждать GetOrders? Затем он будет ждать, прежде чем пытаться обработать следующую синхронизацию. – Dispersia