2013-06-13 34 views
3

我使用的是定时器作为当定时器超时

System.Threading.Timer clipboardTimer = new Timer(ClearClipboard); 

下一个我改变它清除剪贴板的时间间隔为

clipboardTimer.Change(1000,30000); 

在手柄超时功能,即“ClearClipboard” 我要清除剪贴板

void ClearClipboard(object o) 
    { 
     Clipboard.SetText(""); 
    } 

但有system.unauthorised异常,也许这是beca使用有两个不同的线程。所以我怎样才能有效地调用清除剪贴板。

回答

2

这个错误发生的原因上比他UI线程一个单独的线程的计时器事件触发。您可以通过以下两种方式之一更改UI元素。首先是告诉Dispatcher对象在UI线程上执行代码。如果你的Timer对象是一个DependencyObject(例如:PhoneApplicationPage),你可以使用Dispatcher属性。这是通过BeginInvoke方法完成的。

void ClearClipboard(object o) 
{ 
    Dispatcher.BeginInvoke(() => Clipboard.SetText("")); 
} 

如果你的对象是不是DependencyObject的,您可以使用Deployment对象访问调度。

void ClearClipboard(object o) 
{ 
    Deployment.Current.Dispatcher.BeginInvoke(() => Clipboard.SetText("")); 
} 

第二个选项是使用DispatcherTimer而不是Timer对象。 DispatcherTimer事件会在UI线程上触发!

//Create the timer 
DispatcherTimer timer = new DispatcherTimer(); 
timer.Interval = TimeSpan.FromSeconds(3); 
timer.Tick += TimerOnTick; 

// the subscription method 
private void TimerOnTick(object sender, EventArgs eventArgs) 
{ 
    Clipboard.SetText(""); 
} 
+0

谢谢@Shawn Kendrot我已经使用了DispatcherTimer,它运行良好。 – Jatin

0

Dispatcher因为计时器的超时事件在非UI线程上调UI线程来运行Clipboard.SetText("");,你不能从其他线程

改变由UI线程创建的控件尝试是这样的

void ClearClipboard(object o) 
{ 
    Dispatcher.Invoke(() => { Clipboard.SetText(""); }); 
} 
1

您需要在GUI线程上调用该方法。你可以通过调用Control.Invoke来做到这一点。

control.Invoke(new Action(() => control.Text = "new text")));