说明:无论是何种方式异步访问(实现非阻塞),一般都需额外开启线程进行。
一、委托访问
using System;
using System.ServiceModel;
using System.Threading;
using System.Windows;
namespace singleProxyServer_WpfClient
{
public delegate ProxyServerService.CompositeType deletegate_callback(ProxyServerService.CompositeType type);
/// <summary>
/// MainWindow.xaml 的交互逻辑
/// </summary>
public partial class MainWindow : Window
{
static ProxyServerService.SingleServiceClient client = new ProxyServerService.SingleServiceClient("NetTcpBinding_ISingleService", "net.tcp://localhost/SingleService");
ProxyServerService.CompositeType compositeType ;
deletegate_callback delegate_call = new deletegate_callback(client.GetDataUsingDataContract);
public MainWindow()
{
InitializeComponent();
}
private void Button_Click(object sender, RoutedEventArgs e)
{
if (client == null || client.State != CommunicationState.Opened)
client = new ProxyServerService.SingleServiceClient("NetTcpBinding_ISingleService", "net.tcp://localhost/SingleService");
compositeType = new ProxyServerService.CompositeType();
try
{
IAsyncResult asResult2 = delegate_call.BeginInvoke(compositeType, new AsyncCallback(onCallBack) , null);
}
catch(Exception ex)
{
client.Abort();
}
finally
{
//client.Close();
}
}
private void onCallBack(IAsyncResult result)
{
deletegate_callback dlgt = (deletegate_callback)result.AsyncState;
ProxyServerService.CompositeType type = delegate_call.EndInvoke(result);
MessageBox.Show(type.StringValue+";"+ Thread.CurrentThread.ManagedThreadId);
}
private void Button_Click_1(object sender, RoutedEventArgs e)
{
MessageBox.Show("helloWorld");
}
}
}
二、线程访问
using System;
using System.ServiceModel;
using System.Threading;
using System.Threading.Tasks;
using System.Windows;
namespace singleProxyServer_WpfClient
{
/// <summary>
/// MainWindow.xaml 的交互逻辑
/// </summary>
public partial class MainWindow : Window
{
ProxyServerService.SingleServiceClient client;
ProxyServerService.CompositeType compositeType ;
public MainWindow()
{
InitializeComponent();
}
private void Button_Click(object sender, RoutedEventArgs e)
{
if (client == null || client.State != CommunicationState.Opened)
client = new ProxyServerService.SingleServiceClient("NetTcpBinding_ISingleService", "net.tcp://localhost/SingleService");
compositeType = new ProxyServerService.CompositeType();
try
{
//MessageBox.Show(Thread.CurrentThread.ManagedThreadId.ToString());
Task t = Task.Factory.StartNew(() =>
{
ProxyServerService.CompositeType cp = client.GetDataUsingDataContract(compositeType);
MessageBox.Show(cp.StringValue + ";" + Thread.CurrentThread.ManagedThreadId);
});
Task t2 = Task.Factory.StartNew(() =>
{
ProxyServerService.CompositeType cp = client.GetDataUsingDataContract(compositeType);
MessageBox.Show(cp.StringValue + ";" + Thread.CurrentThread.ManagedThreadId);
});
}
catch(Exception ex)
{
client.Abort();
}
finally
{
//client.Close();
}
}
private void Button_Click_1(object sender, RoutedEventArgs e)
{
MessageBox.Show("helloWorld");
}
}
}