Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 异步方法毫无进展_C#_Wcf_Async Await_C# 5.0 - Fatal编程技术网

C# 异步方法毫无进展

C# 异步方法毫无进展,c#,wcf,async-await,c#-5.0,C#,Wcf,Async Await,C# 5.0,我有以下方法,并在控制台应用程序中使用它: static async Task<List<Task<CompositeType>>> callSvcAsync(List<CompositeType> listC) { ChannelFactory<IWcfServiceLayerChannel> cn = new ChannelFactory<IWcfServiceLayerChannel>("My

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

 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;

    }
static async Task callSvcAsync(List listC)
{
ChannelFactory cn=新的ChannelFactory(“MyWcFServiceEndpoint”);
var c=cn.CreateChannel();
List listTasks=新建列表();
秒表sw=新秒表();
sw.Start();
for(int i=0;i
代码调用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;               
        });
    }
async公共静态任务AsyncWcfCall()
{
ChannelFactory cn=新的ChannelFactory(“MyWcFServiceEndpoint”);
var c=cn.CreateChannel();
c、 Open();
List listTasks=新建列表();
秒表sw=新秒表();
sw.Start();
for(int i=0;i
{
sw.Stop();
Console.WriteLine(软件运行总秒数);
尝试
{                   
cn.Close();c.Dispose();
}
捕获{}
返回ct结果;
});
}

好的,我只是在玩C#async,下面的代码就是我想要的。因此,这个问题仍然没有得到回答,但这是可行的:不,它没有,但具体通道有一种处理方法。而且它不会引发异常,因为处理具体通道实例与channelfactory实例无关。。。只是用WCF调用测试C#async…这就是目的。实际上,我不需要ContinueWith,只需要将驻留在ContinueWith中的代码放入finally块中…我在VS2012中创建了一个简单的WCF服务应用程序项目。我没有更改ootb接口。创建一个,您将看到接口的外观:使用:svcutil c生成的客户端代理的类型为:IWcfServiceLayerChannel{System.Runtime.Remoting.Proxies.\uu TransparentProxy}是的,我已经重命名了它,但实现是相同的。如前所述,我使用svcutil生成代理,它创建了一个cs文件:[System.CodeDom.Compiler.GeneratedCodeAttribute(“System.ServiceModel”,“4.0.0.0”)]公共接口IWcfServiceLayerChannel:IWcfServiceLayer,System.ServiceModel.IClientChannel{}IClientChannel实现IDisposable,因此我可以调用Dispose()直接在对象上。公共接口IClientChannel:IContextChannel,IChannel,…,IDisposable{但是为什么调用dispose时它什么地方都没有(或者死锁,不知道)呢