我有一个调用Web服务的方法.
function void SendAsync( object input )
{
// Log Time Before Send to WebService (T1)
...... Call WebMethod ....
// Log Time After Send to WebService (T2)
}
Run Code Online (Sandbox Code Playgroud)
我想运行一个循环并使用不同的输入数据调用Web方法.没有等待响应,我想继续调用Web方法.
for ( int i=1;i<=100;i++ )
{
//LOG TIME BEFORE Calling Async Method (T0)
//TRIAL 1
ThreadPool.QueueUserWorkItem(new WaitCallback(t.SendAsync), i.ToString());
//TRIAL 2
new Task(() => { SendAsync(i.ToString()); }).Start();
//TRIAL 3
Task.Factory.StartNew(() => SendAsync(i.ToString()));
//TRIAL 4
AsyncTask_Delegate adel = null;
adel = new AsyncTask_Delegate(SendAsync);
IAsyncResult R = null;
R = adel.BeginInvoke(i.ToString(), null, null); //invoking the method
}
Run Code Online (Sandbox Code Playgroud)
我想将此函数称为异步调用.我已尝试过如上所述的各种方法.
T0和T1之间的时间非常长(即使在15-40秒内).下一个方法调用在循环中发生,但实际的Web调用方法正在延迟.该方法不是同时运行的.我甚至把SendAsync方法放在不同的类中并且调用方法仍然是相同的结果.....
谢谢大家的回复.
在这个问题上添加更多的亮点是我在每个循环中创建一个输入字符串并将其发送到一个函数进行处理.
即使我们调用普通的简单方法,也不是调用Web方法,而是T0和T1之间的差异很大.
相同的功能在异步模式下运行,但根本无法同时运行或启动.
我试图创建一个像"var tmp = i;"的副本 在打电话之前,但延迟仍然存在.
我怀疑它是并发运行的 - 但是并发程度受到HTTP连接池的限制.
您可以ServicePointManager.DefaultConnectionLimit使用该<connectionManagement>元素在app.config中更改或设置它.
另外,请注意这些行是可疑的:
new Task(() => { SendAsync(i.ToString()); }).Start();
Task.Factory.StartNew(() => SendAsync(i.ToString()));
Run Code Online (Sandbox Code Playgroud)
在这两种情况下,您都在捕获i,主线程正在进行更新.您需要捕获该迭代的值的副本i:
int x = i;
new Task(() => { SendAsync(x.ToString()); }).Start();
Task.Factory.StartNew(() => SendAsync(x.ToString()));
Run Code Online (Sandbox Code Playgroud)
否则你可能会看到SendAsync("2")两次,SendAsync("1")例如没有电话.
| 归档时间: |
|
| 查看次数: |
6705 次 |
| 最近记录: |