【发布时间】:2019-07-26 23:42:18
【问题描述】:
我在一个表上异步执行查询,有一段时间一切都很好,但突然之间查询开始超时。
简而言之,我有一个包含多个 ID 的文本文件,对于每个 ID,我想在表中执行查询。查询本身不应该花费很长时间,少于 5 秒,但是在成功执行许多查询后,应用程序突然开始每次超时。如果我然后重新启动我的应用程序并重新运行超时的 ID,它们现在可以完美运行而没有问题。
假设我有一个 1000 个 ID 的列表,然后它在处理并成功执行 200 个 ID 后开始超时。
我已尝试插入一个 MaximumExecutionTime 并将其设置为远高于标准的 5 秒,但它仍然超时。我试过不共享 CloudTableClients,只是让每个“线程”创建一个新实例。
代码是一个较大项目的一部分,因此我将在此处包含相关部分并省略一些其他代码。我首先创建一个 CloudTableClient,它在不同的任务之间共享,好像我理解正确一样,可以共享它。然后我有一个 ActionBlock,我将 ID 发布到。我将 MaxDegreeOfParallelism 限制为我有多少个处理器,我在这方面有最好的体验。
CloudStorageAccount cloudStorage = CloudStorageAccount.Parse(_ParsedConnectionString);
CloudTableClient tableClient = cloudStorage.CreateCloudTableClient();
var block = new ActionBlock<int>(
async id =>
{
// Do stuff
var res = await executeQuery(id, tableClient);
// Do more stuff
},
new ExecutionDataflowBlockOptions
{
MaxDegreeOfParallelism = Environment.ProcessorCount
}
);
StreamReader file = new StreamReader(someFile);
string line;
while ((line = file.ReadLine()) != null)
{
block.Post(Convert.ToInt32(line));
}
block.Complete();
block.Completion.Wait();
而在executeQuery函数中:
CloudTable table = tableClient.GetTableReference(_someTable);
var tableQuery = new TableQuery<SomeEntity>
{
FilterString = "some query"
};
TableContinuationToken continuationToken = null;
TableRequestOptions options = new TableRequestOptions
{
MaximumExecutionTime = new TimeSpan(0, 2, 0)
};
OperationContext context = new OperationContext();
do
{
var tableQueryResult = await table.ExecuteQuerySegmentedAsync(tableQuery, continuationToken, options, context);
continuationToken = tableQueryResult.ContinuationToken;
// Do stuff
}
while (continuationToken != null);
查询很好,就好像我使用之前超时的 ID 重新运行应用程序一样,它按预期运行。
The client could not finish the operation within specified timeout.
at Microsoft.WindowsAzure.Storage.Core.Executor.Executor.EndExecuteAsync[T](IAsyncResult result) in c:\Program Files (x86)\Jenkins\workspace\release_dotnet_master\Lib\ClassLibraryCommon\Core\Executor\Executor.cs:line 51
at Microsoft.WindowsAzure.Storage.Core.Util.AsyncExtensions.<>c__DisplayClass2`1.<CreateCallback>b__0(IAsyncResult ar) in c:\Program Files (x86)\Jenkins\workspace\release_dotnet_master\Lib\ClassLibraryCommon\Core\Util\AsyncExtensions.cs:line 69
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()
at App.Parser.<executeQuery>d__25.MoveNext()`
【问题讨论】:
标签: c# async-await task-parallel-library azure-storage