【问题标题】:Writing to Azure Table Storage with BeginExecute使用 BeginExecute 写入 Azure 表存储
【发布时间】:2013-04-06 01:44:14
【问题描述】:

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

【问题讨论】:

    标签: c# azure asynchronous azure-storage


    【解决方案1】:

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

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

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

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

    【讨论】:

    • AsyncWaitHandle 是我一直在寻找的,谢谢。我现在只跟踪我有哪些操作待处理并使用WaitOne 确保它们在退出应用程序之前完成。
    猜你喜欢
    • 2017-10-05
    • 2021-04-30
    • 2019-03-08
    • 2023-01-03
    • 2017-04-20
    • 1970-01-01
    • 2021-11-26
    • 2020-11-15
    • 1970-01-01
    相关资源
    最近更新 更多