异步方法无处可去

时间:2013-07-27 22:06:06

标签: c# wcf async-await c#-5.0

我有以下方法并在我的控制台应用程序中使用它:

 static async Task<List<Task<CompositeType>>> callSvcAsync(List<CompositeType> listC)
    {
        ChannelFactory<IWcfServiceLayerChannel> cn = new ChannelFactory<IWcfServiceLayerChannel>("MyWcFServiceEndpoint");
        var c = cn.CreateChannel();
        List<Task<CompositeType>> listTasks = new List<Task<CompositeType>>();
        Stopwatch sw = new Stopwatch();
        sw.Start();

        for (int i = 0; i < loopCount; i++)
        {
            Task<CompositeType> res = c.GetDataUsingDataContractAsync(new CompositeType() { BoolValue = true, StringValue = "SomeString" });
            listTasks.Add(res);
        }

        CompositeType[] value = await Task.WhenAll(listTasks);
        sw.Stop();
        Console.WriteLine(sw.Elapsed.TotalSeconds);
        listC.AddRange(value);

        **c.Dispose();**

        return listTasks;

    }

代码调用wcf方法1000次。 之后填充列表对象,并在控制台中显示操作所消耗的时间。 当我处理我的wcf频道时没有任何反应。该方法不会返回到调用代码。 当我注释掉“\ c.Dispose()”时,一切正常。

有什么想法吗?

修改 我上面的问题没有答案,但以下代码有效:

async public static Task<CompositeType[]> AsyncWcfCall()
    {
        ChannelFactory<IWcfServiceLayerChannel> cn = new ChannelFactory<IWcfServiceLayerChannel>("MyWcFServiceEndpoint");
        var c = cn.CreateChannel();
        c.Open();


        List<Task<CompositeType>> listTasks = new List<Task<CompositeType>>();

        Stopwatch sw = new Stopwatch();
        sw.Start();

        for (int i = 0; i < loopCount; i++)
        {
            var res = c.GetDataUsingDataContractAsync(new CompositeType() { BoolValue = true, StringValue = "SomeString" });
            listTasks.Add(res);
        }

        return await Task.WhenAll(listTasks).ContinueWith((ct) =>
        {
            sw.Stop();
            Console.WriteLine(sw.Elapsed.TotalSeconds);
            try
            {                   
                cn.Close(); c.Dispose();
            }
            catch {  }
            return ct.Result;               
        });
    }

0 个答案:

没有答案