ものすごく今さらだけど、知らなかった。 というか、試そうともしていなかった。
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(); } } }