C#同时多次调用单个方法

时间:2014-08-21 13:28:17

标签: c# .net asynchronous

我有一个调用Web服务的方法。

function void SendAsync( object input )
{
     // Log Time Before Send to WebService (T1)
     ......  Call WebMethod ....
     // Log Time After Send to WebService (T2)
}

我想运行循环并使用不同的输入数据调用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
}

我想将此函数称为异步调用。 我已尝试过如上所述的各种方法。

T0和T1之间的时间相当长(即使在15-40秒内)。 下一个方法调用在循环中发生,但实际的Web调用方法正在延迟。 该方法不是同时运行的。 我甚至把SendAsync方法放在不同的类中,调用方法仍然是相同的结果......

----------------------------------------------- ---------------------------------


谢谢大家的回复。

为问题添加更多信息是我在每个循环中创建一个输入字符串并将其发送到函数进行处理。

即使我们调用普通的简单方法,也不是调用Web方法,而是T0和T1之间的差异很大。

同样的功能在异步模式下运行,但根本无法同时运行或启动。

我试图创建一个像“var tmp = i;”这样的副本在打电话之前,但延迟仍然存在。

3 个答案:

答案 0 :(得分:5)

我怀疑并发运行 - 但是并发程度受到HTTP连接池的限制。

您可以更改ServicePointManager.DefaultConnectionLimit或使用<connectionManagement>元素在app.config中进行设置。

另外,请注意这些行是可疑的:

new Task(() => { SendAsync(i.ToString()); }).Start();
Task.Factory.StartNew(() => SendAsync(i.ToString()));

在这两种情况下,您都在捕获正在由主线程更新的i。您需要为该迭代捕获i值的副本

int x = i;
new Task(() => { SendAsync(x.ToString()); }).Start();
Task.Factory.StartNew(() => SendAsync(x.ToString()));

否则,您可能会看到SendAsync("2")两次,而不会打电话给SendAsync("1")

答案 1 :(得分:0)

我不是异步的专家,但我认为你想要这样的东西:

var tasks = new List<Task>();
for(int i = 0; i< 100; i ++)
    tasks.Add(Task<int>.Factory.StartNew(() => SendAsync(i), i));

Task.WaitAll(tasks);

更多信息:http://msdn.microsoft.com/en-us/library/dd270695(v=vs.110).aspx

答案 2 :(得分:0)

这适用于我并运行异步:

void Main()
{
    for ( int i=1;i<=100;i++ )
    { 
        var tmp = i; // this line is needed, you might get the same value for variable i for several calls otherwize!
        Task.Run(() => { SendAsync(tmp.ToString()); });
    }
}