我发现有时候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找不到“关闭”。
知道如何获得所有回复吗?在第一次回复中有没有像某些关闭/结束通话那样的缺失?
答案 0 :(得分:0)
由于我没有找到解决方案,我将使用解决方法。而不是使用异步方法,将在自己的线程中使用同步。