Multithreading WCF-关于WCF任务的新手问题;
这是WCF内部任务的最佳方法Multithreading WCF-关于WCF任务的新手问题;,multithreading,wcf,Multithreading,Wcf,这是WCF内部任务的最佳方法 var tsk1 = Task.Factory.StartNew<list<object>>(()=> { Mysvc svc1 = new Mysvc(); var t = svc1.getData(); scv1.Close(); return t; }); var tsk2 = Task.Factory.StartNew<list<object>>(()=> { Mysvc
var tsk1 = Task.Factory.StartNew<list<object>>(()=> {
Mysvc svc1 = new Mysvc();
var t = svc1.getData();
scv1.Close();
return t;
});
var tsk2 = Task.Factory.StartNew<list<object>>(()=> {
Mysvc svc1 = new Mysvc();
var t2 = svc1.getData();
scv1.Close();
return t2;
});
Task.WaitALL(tsk1,tsk2);
var res = tsk1.Result;
var res2 = tsk2.Result;
var tsk1=Task.Factory.StartNew(()=>{
Mysvc svc1=新的Mysvc();
var t=svc1.getData();
scv1.Close();
返回t;
});
var tsk2=Task.Factory.StartNew(()=>{
Mysvc svc1=新的Mysvc();
var t2=svc1.getData();
scv1.Close();
返回t2;
});
Task.WaitALL(tsk1,tsk2);
var res=tsk1.结果;
var res2=tsk2.结果;
非常感谢您如果您有一个合同的异步版本(如果您使用的是svcutil或add service reference,您可以通过指定适当的选项来获得),那么您也可以使用
Task.Factory.fromsync
方法来实现这一点:
public class StackOverflow_6237996
{
[ServiceContract(Name = "ITest")]
public interface ITest
{
[OperationContract]
int Add(int x, int y);
}
[ServiceContract(Name = "ITest")]
public interface ITestAsync
{
[OperationContract(AsyncPattern = true)]
IAsyncResult BeginAdd(int x, int y, AsyncCallback callback, object userState);
int EndAdd(IAsyncResult asyncResult);
}
public class Service : ITest
{
public int Add(int x, int y)
{
Thread.Sleep(100);
return x + y;
}
}
public static void Test()
{
string baseAddress = "http://" + Environment.MachineName + ":8000/Service";
ServiceHost host = new ServiceHost(typeof(Service), new Uri(baseAddress));
host.AddServiceEndpoint(typeof(ITest), new BasicHttpBinding(), "");
host.Open();
Console.WriteLine("Host opened");
ChannelFactory<ITestAsync> factory = new ChannelFactory<ITestAsync>(new BasicHttpBinding(), new EndpointAddress(baseAddress));
ITestAsync proxy = factory.CreateChannel();
var tsk1 = Task.Factory.FromAsync<int>(
proxy.BeginAdd(4, 5, null, null),
(ar) => proxy.EndAdd(ar));
var tsk2 = Task.Factory.FromAsync<int>(
proxy.BeginAdd(7, 8, null, null),
(ar) => proxy.EndAdd(ar));
Task.WaitAll(tsk1, tsk2);
Console.WriteLine("Result 1: {0}", tsk1.Result);
Console.WriteLine("Result 2: {0}", tsk2.Result);
((IClientChannel)proxy).Close();
factory.Close();
Console.Write("Press ENTER to close the host");
Console.ReadLine();
host.Close();
}
}
公共类StackOverflow_6237996
{
[服务合同(Name=“ITest”)]
公共接口测试
{
[经营合同]
整数加(整数x,整数y);
}
[服务合同(Name=“ITest”)]
公共接口ITestAsync
{
[操作契约(AsyncPattern=true)]
IAsyncResult BeginAdd(int x,int y,异步回调,对象userState);
int EndAdd(IAsyncResult异步结果);
}
公共类服务:ITest
{
公共整数相加(整数x,整数y)
{
睡眠(100);
返回x+y;
}
}
公共静态无效测试()
{
string baseAddress=“http://“+Environment.MachineName+”:8000/服务”;
ServiceHost主机=新ServiceHost(类型(服务),新Uri(基地址));
AddServiceEndpoint(typeof(ITest),new BasicHttpBinding(),“”);
host.Open();
Console.WriteLine(“主机已打开”);
ChannelFactory工厂=新的ChannelFactory(新的BasicHttpBinding(),新的EndpointAddress(baseAddress));
itestatsync proxy=factory.CreateChannel();
var tsk1=Task.Factory.fromsync(
proxy.BeginAdd(4,5,null,null),
(ar)=>proxy.EndAdd(ar));
var tsk2=Task.Factory.fromsync(
proxy.BeginAdd(7,8,null,null),
(ar)=>proxy.EndAdd(ar));
Task.WaitAll(tsk1,tsk2);
WriteLine(“结果1:{0}”,tsk1.Result);
WriteLine(“结果2:{0}”,tsk2.Result);
((IClientChannel)代理).Close();
工厂关闭();
控制台。写入(“按ENTER键关闭主机”);
Console.ReadLine();
host.Close();
}
}
谢谢卡洛斯,我会试试让你知道……再次感谢你的帮助