我正在尝试使用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);时,一切都写完了。有没有一种方法可以在主线程结束之前将其暂停,以确保所有其他线程都已完成,以便在完成之前不会被取消?

最佳答案

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

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


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

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

关于c# - 使用BeginExecute写入Azure表存储,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15836903/

10-11 23:52