2

我正在尝试使用异步写入 Azure 表存储,BeginExecute但结果不一致。当我更改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);主线程放在末尾时,一切都写完了。有没有办法在主线程结束之前暂停它以确保所有其他线程都已完成,这样它们就不会在完成之前被取消?

4

1 回答 1

2

可能发生的事情是您的主线程结束,并销毁所有活动的子线程。当您进行异步编程时,您的主线程要么需要运行足够长的时间以等待完成(例如服务),要么需要等待异步任务完成:

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

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

这当然引出了一个问题:如果您在等待“异步”任务完成时不需要做任何其他事情,那么您不妨同步执行以使事情变得更简单。异步模式的目的是让线程在等待其他进程完成时不应该被阻塞 - 以增加复杂性为代价。

于 2013-04-05T17:44:14.063 回答