为什么不能正确地从服务中获取价值!!! [英] Why don't work correctly getting of value from service!!!

查看:71
本文介绍了为什么不能正确地从服务中获取价值!!!的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

///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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆