2013-04-05 43 views
2

我试图使用BeginExecute异步写入Azure表存储,但一直得到不一致的结果。当我将BeginExecute更改为Execute时,所有内容都可以正确写入,但我猜我的线程有问题,它们要么取消对方,要么取决于主线程发送消息的速度。下面是我现在在做什么:使用BeginExecute写入Azure表存储

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);放在主线程的末尾时,所有东西都写完了。有没有办法在主线程结束之前暂停主线程,以确保所有其他线程都已完成,以便在完成之前不会取消主线程?

回答

2

可能发生的情况是您的主线程结束并破坏所有活动的子线程。当你正在做异步编程,你的主线程要么需要足够长时间运行,以等待完成(如服务),或者需要等待异步任务完成:

var result = _table.BeginExecute(op, 
    new AsyncCallback(onTableExecuteComplete), entity); 
result.AsyncWaitHandle.WaitOne(); 

来源:http://msdn.microsoft.com/en-us/library/system.iasyncresult.aspx

这当然会引发一个问题:如果在等待“异步”任务完成时不需要执行其他任何操作,那么您可以同步执行以保持简单。异步模式的目的是为了在等待某个其他进程完成时不应该被阻塞的线程 - 这是以增加复杂性为代价的。

+0

'AsyncWaitHandle'是我在找的,谢谢。我现在只是跟踪我有什么操作挂起,并使用'WaitOne'确保它们在退出应用程序之前完成。 – jeffaudio 2013-04-05 18:12:25