WCF って TPL をサポートしていたのか

ものすごく今さらだけど、知らなかった。 というか、試そうともしていなかった。

using System;
using System.ServiceModel;
using System.ServiceModel.Channels;
using System.Threading.Tasks;

namespace WcfAsyncSample
{
    [ServiceContract]
    public interface IGreetingService
    {
        [OperationContract]
        Task<string> GreetAsync(string name);
    }

    public class GreetingService : IGreetingService
    {
        public async Task<string> GreetAsync(string name)
        {
            await Task.Delay(2000);
            return await Task.FromResult(string.Format("Hello, {0}", name));
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            var address = "net.pipe://localhost/Greeting";
            var binding = new NetNamedPipeBinding();

            var host = new ServiceHost(typeof(GreetingService));
            host.AddServiceEndpoint(typeof(IGreetingService), binding, address);
            host.Open();

            var client = ChannelFactory<IGreetingService>.CreateChannel(binding, new EndpointAddress(address));
            client.GreetAsync("Honda").ContinueWith(task =>
            {
                Console.WriteLine(task.Result);
            });

            Console.WriteLine("Enter で終了します。");
            Console.ReadLine();
            ((IChannel)client).Close();
            host.Close();
        }
    }
}

f:id:griefworker:20150223095902p:plain