在WPF中设置同步对象
在哪里可以获得ISynchronizeInvoke,以便可以与UI线程同步 System.Timers.Timer gTimer; g定时同步对象 这可能有效 gTimer.SynchronizingObject=新建 DispatcherInformCompataAdapter(this.Dispatcher))在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
您是混合使用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
}