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时它什么地方都没有(或者死锁,不知道)呢