我正在尝试使用BeginExecute
异步写入Azure表存储,但结果不一致。当我将BeginExecute
更改为Execute
时,所有内容都会正确编写,但我猜我的帖子中有一些错误,他们要么互相取消,要么取决于主线程发送的速度消息。这就是我现在正在做的事情:
TableOperation op = TableOperation.Insert(entity);
_table.BeginExecute(op, new AsyncCallback(onTableExecuteComplete), entity);
private void onTableExecuteComplete(IAsyncResult result)
{
TableResult tr = _table.EndExecute(result);
if ((tr.HttpStatusCode < 200) || (tr.HttpStatusCode > 202))
{
Console.WriteLine("Error writing to table.");
}
}
我正在使用一些条目对其进行测试,我会在表格中获得一两个条目,但不是全部条目。关于如何捕获错误并确保所有条目都写得正确的任何想法?
更新:我发现当我将Thread.Sleep(5000);
放在主线程的末尾时,所有内容都会完成。有没有办法在主线程结束之前暂停它,以确保所有其他线程都已完成,这样它们就不会在它们完成之前被取消?
答案 0 :(得分:2)
可能发生的事情是你的主线程结束,并且销毁所有活动的子线程。当您进行异步编程时,您的主线程需要运行足够长的时间才能等待完成(例如服务),或者它需要等待异步任务完成:
var result = _table.BeginExecute(op,
new AsyncCallback(onTableExecuteComplete), entity);
result.AsyncWaitHandle.WaitOne();
来源:http://msdn.microsoft.com/en-us/library/system.iasyncresult.aspx
这当然引出了一个问题:如果您在等待“异步”任务完成时不需要做任何其他事情,那么您也可以同步执行以保持简单。异步模式的目的是为了在等待其他进程完成时不应阻塞的线程 - 以增加复杂性为代价。