定时器超时时清除剪贴板

时间:2013-06-13 05:40:53

标签: c# windows-phone-7

我正在使用计时器

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

接下来,我将其间隔更改为

clipboardTimer.Change(1000, 30000);

在句柄超时功能中,即ClearClipboard,我想将剪贴板清除为

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

但有System.Unauthorised例外。也许,这是因为有两种不同的线程。那么,如何有效地调用清晰的剪贴板呢?

3 个答案:

答案 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")));