在WPF中设置同步对象

在WPF中设置同步对象,wpf,thread-safety,Wpf,Thread Safety,在哪里可以获得ISynchronizeInvoke,以便可以与UI线程同步 System.Timers.Timer gTimer; g定时同步对象 这可能有效 gTimer.SynchronizingObject=新建 DispatcherInformCompataAdapter(this.Dispatcher)) 您是混合使用WinForms和WPF,还是新加入WPF?您还有Dispatchermer For clean WPF timer“使用Dispatchermer而不是System.T

在哪里可以获得ISynchronizeInvoke,以便可以与UI线程同步

System.Timers.Timer gTimer; g定时同步对象

这可能有效

gTimer.SynchronizingObject=新建 DispatcherInformCompataAdapter(this.Dispatcher))


您是混合使用WinForms和WPF,还是新加入WPF?您还有Dispatchermer For clean WPF timer“使用Dispatchermer而不是System.Timers.timer的原因是Dispatchermer与Dispatcher在同一线程上运行”谢谢您,工作得很好。比我预期的代码多得多,谢谢你的解决方案
internal class DispatcherWinFormsCompatAdapter : ISynchronizeInvoke
  {
       #region IAsyncResult implementation
      private class DispatcherAsyncResultAdapter : IAsyncResult
        {
            private DispatcherOperation m_op;
             private object m_state;

            public DispatcherAsyncResultAdapter(DispatcherOperation operation)
            {
                m_op = operation;
            }

            public DispatcherAsyncResultAdapter(DispatcherOperation operation, object state)
               : this(operation)
            {
                m_state = state;
           }

            public DispatcherOperation Operation
            {
                get { return m_op; }
            }

            #region IAsyncResult Members

            public object AsyncState
            {
                get { return m_state; }
            }

           public WaitHandle AsyncWaitHandle
            {
                get { return null; }
            }

            public bool CompletedSynchronously
            {
                get { return false; }
            }

            public bool IsCompleted
            {
                get { return m_op.Status == DispatcherOperationStatus.Completed; }
            }

            #endregion
        }
        #endregion
        private Dispatcher m_disp;
        public DispatcherWinFormsCompatAdapter(Dispatcher dispatcher)
        {
            m_disp = dispatcher;
        }
        #region ISynchronizeInvoke Members

        public IAsyncResult BeginInvoke(Delegate method, object[] args)
        {
            if (args != null && args.Length > 1)
            {
                object[] argsSansFirst = GetArgsAfterFirst(args);
                DispatcherOperation op = m_disp.BeginInvoke(DispatcherPriority.Normal, method, args[0], argsSansFirst);
                return new DispatcherAsyncResultAdapter(op);
            }
            else
            {
                if (args != null)
                {
                    return new DispatcherAsyncResultAdapter(m_disp.BeginInvoke(DispatcherPriority.Normal, method, args[0]));
                }
                else
                {
                    return new DispatcherAsyncResultAdapter(m_disp.BeginInvoke(DispatcherPriority.Normal, method));
                }
            }
        }

        private static object[] GetArgsAfterFirst(object[] args)
        {
            object[] result = new object[args.Length - 1];
            Array.Copy(args, 1, result, 0, args.Length - 1);
            return result;
        }

        public object EndInvoke(IAsyncResult result)
        {
            DispatcherAsyncResultAdapter res = result as DispatcherAsyncResultAdapter;
            if (res == null)
                throw new InvalidCastException();

            while (res.Operation.Status != DispatcherOperationStatus.Completed || res.Operation.Status == DispatcherOperationStatus.Aborted)
            {
                Thread.Sleep(50);
            }

            return res.Operation.Result;
        }

        public object Invoke(Delegate method, object[] args)
       {
           if (args != null && args.Length > 1)
           {
               object[] argsSansFirst = GetArgsAfterFirst(args);
               return m_disp.Invoke(DispatcherPriority.Normal, method, args[0], argsSansFirst);
           }
           else
           {
               if (args != null)
               {
                   return m_disp.Invoke(DispatcherPriority.Normal, method, args[0]);
               }
               else
               {
                   return m_disp.Invoke(DispatcherPriority.Normal, method);
               }
           }
       }

       public bool InvokeRequired
       {
           get { return m_disp.Thread != Thread.CurrentThread; }
       }

       #endregion
   }