为什么不能正确地从服务中获取价值!!! [英] Why don't work correctly getting of value from service!!!
本文介绍了为什么不能正确地从服务中获取价值!!!的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
///Client window
public partial class Autorization : Window
{
private bool Autos;
public Autorization()
{
InitializeComponent();
NetNamedPipeBinding binding = new NetNamedPipeBinding();
EndpointAddress address = new EndpointAddress("net.pipe://localhost/Service");
CurUser._clientCallback = new ClientCallback();
CurUser._clientCallback.RecieveAut += UpdateAutos;
//InstanceContext створює оболонку для екземпляра класу ClientCallback
//завдяки цьому служба може викликати обєкт через канал
InstanceContext context = new InstanceContext(CurUser._clientCallback);
DuplexChannelFactory<duplexdllclass.imessagecallbackservice> factory = new DuplexChannelFactory<duplexdllclass.imessagecallbackservice>(context, binding, address);
CurUser.Proxy = factory.CreateChannel();
}
void UpdateAutos()
{
Autos = CurUser._clientCallback.Autos;
}
private void btn_LoginClick(object sender, RoutedEventArgs e)
{
CurUser.Proxy.AutorizationSendToServiceMessage(new User());
UpdateAutos();
Autos.ToString();
if (Autos) MessageBox.Show("Happy");
MessageBox.Show("dfasdf");
}
private void btn_RegClick(object sender, RoutedEventArgs e)
{
}
///Service
public class Service : DuplexDllClass.IMessageCallbackService
{
private void ThreadAutorizationCallback(object callback)
{
DuplexDllClass.IMessageCallbackClient messageCallback = callback as DuplexDllClass.IMessageCallbackClient;
messageCallback.AutorizationSendToClient(true);
Thread.Sleep(1000);
}
public void AutorizationSendToServiceMessage(User user)
{
DuplexDllClass.IMessageCallbackClient proxy = OperationContext.Current.GetCallbackChannel<duplexdllclass.imessagecallbackclient>();
//посилаємо повідомлення клієнту
// proxy.MessageToClient("Message from server"); //create new thread
//запускаємо потік та передаємо йому об’єкт проксі класу
new Thread(ThreadAutorizationCallback).Start(proxy);
}
}
//Service window
internal static ServiceHost serviceHost;
internal static void StartService()
{
serviceHost = new ServiceHost(typeof(Service), new Uri("net.pipe://localhost/Service"));
serviceHost.AddServiceEndpoint(typeof(DuplexDllClass.IMessageCallbackService), new NetNamedPipeBinding(), "");
serviceHost.Open();
}
internal static void StopService()
{
if (serviceHost.State != CommunicationState.Closed)
serviceHost.Close();
}
static void Main(string[] args)
{
Console.WriteLine("Service runnig");
Service service= new Service();
StartService();
Console.ReadLine();
StopService();
}
}
//Client
class ClientCallback : DuplexDllClass.IMessageCallbackClient
{
public Action RecieveAut;
public bool Autos;
public void AutorizationSendToClient(bool rezalt)
{
Autos = rezalt;
}
}</duplexdllclass.imessagecallbackclient></duplexdllclass.imessagecallbackservice></duplexdllclass.imessagecallbackservice>
推荐答案
眼球编译此代码(不使用计算机),就产生了竞争条件.由于调用了回调并在线程中设置了标志,因此直到您返回客户端并更新了客户端标志后,它才能完成标志的设置.
Eye-ball compiling this code (without using a computer), you have a race-condition. Since you call the callback and set the flag in a thread, it might not finish setting the flag until after you have returned in the client and updated the client side flag.
这篇关于为什么不能正确地从服务中获取价值!!!的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文