Multithreading 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

这是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 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();
}
}

谢谢卡洛斯,我会试试让你知道……再次感谢你的帮助