我正在使用计时器
System.Threading.Timer clipboardTimer = new Timer(ClearClipboard);
接下来,我将其间隔更改为
clipboardTimer.Change(1000, 30000);
在句柄超时功能中,即ClearClipboard
,我想将剪贴板清除为
void ClearClipboard(object o)
{
Clipboard.SetText("");
}
但有System.Unauthorised
例外。也许,这是因为有两种不同的线程。那么,如何有效地调用清晰的剪贴板呢?
答案 0 :(得分:3)
发生此错误是因为Timer
事件在与UI线程不同的单独线程上触发。您可以通过两种方式之一更改UI元素。第一种是告诉Dispatcher
对象在UI线程上执行代码。如果您的Timer
对象为DependencyObject
(例如PhoneApplicationPage
),则可以使用Dispatcher
属性。这是通过BeginInvoke
方法完成的。
void ClearClipboard(object o)
{
Dispatcher.BeginInvoke(() => Clipboard.SetText(""));
}
如果您的对象不是DependencyObject
,则可以使用Deployment
对象访问Dispatcher
。
void ClearClipboard(object o)
{
Deployment.Current.Dispatcher.BeginInvoke(() => Clipboard.SetText(""));
}
第二个选项是使用DispatcherTimer
代替Timer
。在UI线程上触发DispatcherTimer
事件 !
// 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("");
}
答案 1 :(得分:1)
要求Dispatcher
在UI线程上运行Clipboard.SetText("");
,因为在非UI线程上引发了计时器的超时事件,并且您无法更改UI线程从另一个线程创建的控件
尝试这样的事情
void ClearClipboard(object o)
{
Dispatcher.Invoke( () => { Clipboard.SetText(""); });
}
答案 2 :(得分:1)
您需要在GUI线程上Invoke
方法。你可以致电Control.Invoke
:
control.Invoke(new Action(() => control.Text = "new text")));