Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 执行多个查询后超时的执行查询_C#_Async Await_Task Parallel Library_Azure Storage - Fatal编程技术网

C# 执行多个查询后超时的执行查询

C# 执行多个查询后超时的执行查询,c#,async-await,task-parallel-library,azure-storage,C#,Async Await,Task Parallel Library,Azure Storage,我正在异步执行表上的查询,暂时一切正常,但突然查询开始超时 简而言之,我有一个包含许多ID的文本文件,对于这些ID中的每一个,我都希望在表中执行一个查询。查询本身不应该花费很长时间,不到5秒,但是在成功执行了许多查询之后,应用程序每次都会突然开始超时。如果我重新启动我的应用程序并重新运行超时的ID,它们现在可以正常运行 假设我有一个1000个ID的列表,那么它在处理并成功执行了200个ID之后开始超时 我尝试插入MaximumExecutionTime并将其设置为远高于标准的5秒,但它仍然超时。

我正在异步执行表上的查询,暂时一切正常,但突然查询开始超时

简而言之,我有一个包含许多ID的文本文件,对于这些ID中的每一个,我都希望在表中执行一个查询。查询本身不应该花费很长时间,不到5秒,但是在成功执行了许多查询之后,应用程序每次都会突然开始超时。如果我重新启动我的应用程序并重新运行超时的ID,它们现在可以正常运行

假设我有一个1000个ID的列表,那么它在处理并成功执行了200个ID之后开始超时

我尝试插入MaximumExecutionTime并将其设置为远高于标准的5秒,但它仍然超时。我尝试过不共享CloudTableClient,只是让每个“线程”创建一个新实例

该代码是一个更大项目的一部分,因此我将在这里包括相关的位,并省略一些其他代码。我首先创建一个CloudTableClient,它在不同的任务之间共享,就好像我正确理解了它一样,可以共享它。然后,我有一个操作块,我将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();
CloudStorageAccount cloudStorage=CloudStorageAccount.Parse(\u ParsedConnectionString);
CloudTableClient tableClient=cloudStorage.CreateCloudTableClient();
var block=新动作块(
异步id=>
{
//做事
var res=等待执行(id,tableClient);
//多做事
},
新的ExecutionDataflowBlockOptions
{
MaxDegreeOfParallelism=Environment.ProcessorCount
}
);
StreamReader文件=新的StreamReader(someFile);
弦线;
而((line=file.ReadLine())!=null)
{
block.Post(转换为32(行));
}
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);
CloudTable table=tableClient.GetTableReference(\u someTable);
var tableQuery=新tableQuery
{
FilterString=“一些查询”
};
TableContinuationToken continuationToken=null;
TableRequestOptions=new TableRequestOptions
{
MaximumExecutionTime=新的时间跨度(0,2,0)
};
OperationContext上下文=新的OperationContext();
做
{
var tableQueryResult=wait table.ExecuteQuerySegmentedAsync(tableQuery、continuationToken、options、context);
continuationToken=tableQueryResult.continuationToken;
//做事
}
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:\Program Files(x86)\Jenkins\workspace\release\u dotnet\u master\Lib\ClassLibraryCommon\Core\Executor\Executor.cs中的Microsoft.WindowsAzure.Storage.Core.Executor.Executor.EndExecuteAsync[T](IAsyncResult结果):第51行
在Microsoft.WindowsAzure.Storage.Core.Util.AsyncExtensions.c_uuu中,以c:\Program Files(x86)\Jenkins\workspace\release\u dotnet\u master\Lib\ClassLibraryCommon\Core\Util\AsyncExtensions.cs:第69行显示Class2`1.b_uu0(IAsyncResult ar)
---来自引发异常的上一个位置的堆栈结束跟踪---
在System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()中
在System.Runtime.CompilerServices.TaskWaiter.HandleNonSuccessAndDebuggerNotification(任务任务)中
在System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()中
在App.Parser.d_uu25.MoveNext()中`

根据得到的异常情况,您的查询正在AzureStorage上运行。某些存储操作受到数量/分钟配额的限制

基本上读/写几乎是无限的,但管理是无限的


例如,如果您在每个请求中首先尝试获取存储密钥,那么您可能会达到限制,然后azure会对您进行限制(这可能导致超时,因为限制是每分钟一次)。

您的查询是根据您得到的异常情况针对AzureStorage运行的。某些存储操作受到数量/分钟配额的限制

基本上读/写几乎是无限的,但管理是无限的


例如,如果在每个请求中您首先尝试获取存储密钥,那么您可能会达到限制,然后azure会对您进行限制(这可能导致超时,因为限制是每分钟进行的)。

CloudStorageAccount,
CloudTableClient
CloudTable
都不是线程安全的

仍在记录
CloudTableClient
的少数参考资料,例如所有参考资料都有以下免责声明:

此类型的任何公共静态(Visual Basic中的共享)成员都是线程安全的。任何实例成员都不能保证线程安全


您的
cloudStorage
tableClient
实例可能被线程破坏,这就是为什么重新启动进程会修复它。
CloudStorageAccount
CloudTableClient
CloudTable
都不是线程安全的

仍在记录
CloudTableClient
的少数参考资料,例如所有参考资料都有以下免责声明:

此类型的任何公共静态(Visual Basic中的共享)成员都是线程安全的。任何实例成员都不能保证线程安全


您的
cloudStorage
tableClient
实例可能被线程破坏,这就是为什么重新启动进程会修复它。

但如果是这样,那么为什么重新运行应用程序会修复此问题?有没有一种方法可以让我在不重新运行应用程序的情况下达到同样的效果?如果我没有记错的话,上次我遇到这个问题时,滴水的速度大约是800/分钟。如果您有1000个元素,那么您可能可以在