【发布时间】:2017-02-14 10:33:29
【问题描述】:
我发现有时 OData 服务 (v2) 的 BeginExecute 方法的回调不会触发。仅当有多个并行异步请求运行时才会发生这种情况。 一些演示代码:
public void Run()
{
Service = new SAP.TEST_SRV_Entities(new Uri(@"https://..."));
Service.Credentials = new NetworkCredential("user", "password");
Service.MergeOption = System.Data.Services.Client.MergeOption.NoTracking;
for (int i = 0; i < 6; i++)
{
AsyncCallback callback = new AsyncCallback(Response);
string url = @"https://...";
Service.BeginExecute<SAP.Folder>(new Uri(url), callback, null);
Console.WriteLine("Request");
//System.Threading.Thread.Sleep(1000);
}
}
void Response(IAsyncResult asyncResult)
{
Console.WriteLine("Response");
List<SAP.Folder> sapfolders = Service.EndExecute<SAP.Folder>(asyncResult).ToList();
}
程序的输出是:
Request
Request
Request
Request
Request
Request
Response
Response
Response
Response
6 个请求已启动,但只有 4 个已结束。 我的服务器上没有收到丢失的两个请求。如果我在请求之间插入睡眠或者它们被称为同步,那么一切都很好,我会得到所有响应。 在我看来,第一个请求是不正确的完成。增加 ServicePointManager.DefaultConnectionLimit 会导致更多完成的请求。 该代码由 wpf 按钮的事件处理程序调用,因此应用程序没有退出。
如果我错过在 http 请求的 WebResponse 上调用 close,我会收到类似的错误。在 WCF 中找不到“关闭”。
知道如何获得所有回复吗?第一次响应时是否缺少某些内容,例如关闭/完成调用?
【问题讨论】: