WCF - новый вопрос о задачах WCF; - PullRequest
0 голосов
/ 04 июня 2011

это лучший подход для внутренних задач 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;

Большое спасибо

1 Ответ

2 голосов
/ 04 июня 2011

Если у вас есть асинхронная версия договора (которую, если вы используете svcutil или добавляете ссылку на службу, вы можете получить, указав соответствующую опцию), вы можете использовать метод Task.Factory.FromAsync, чтобы сделать это также:

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();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...