我在我的main函数中实例化了一个名为'watcher'的FileSystemWatcher对象。我试图在'watcher.renamed'事件期间将文本存储在剪贴板中的字符串变量中,但它总是返回空数据?我在断点的帮助下检查了变量的值,它仍然是空的。
以下是代码:
private void Form1_Load(object sender, EventArgs e)
{
FileSystemWatcher watcher = new FileSystemWatcher();
watcher.Path = Application.StartupPath;
watcher.Filter = Path.GetFileName(Application.StartupPath+ @"\RBsTurn.txt");
watcher.Renamed += new RenamedEventHandler(watcher_Renamed);
watcher.EnableRaisingEvents = true;
}
void watcher_Renamed(object sender, RenamedEventArgs e)
{
string x = Clipboard.GetText();
MessageBox.Show(x);
}
此代码在重命名文件时始终显示空文本框。请帮助。
答案 0 :(得分:3)
Clipboard
访问方法才能正常运行。不幸的是,FileSystemWatcher
在线程池线程上运行其回调,所有这些都是MTA的一部分。因此,尝试访问剪贴板在您的示例中不起作用。
如果您需要在运行事件处理程序时执行一些UI工作,那么您需要通知表单(或其他一些UI)。您可以使用Form
对象的BeginInvoke()
方法发布在UI线程上运行的方法:
void watcher_Renamed(object sender, RenamedEventArgs e)
{
this.BeginInvoke(new Action(() => {
string x = Clipboard.GetText();
MessageBox.Show(x);
}));
}
答案 1 :(得分:0)
诀窍是在事件处理程序中创建一个新线程并设置其STA属性
这是代码
private void Form1_Load(object sender, EventArgs e)
{
FileSystemWatcher watcher = new FileSystemWatcher();
watcher.Path = Application.StartupPath;
watcher.Filter = Path.GetFileName(Application.StartupPath+ @"\RBsTurn.txt");
watcher.Renamed += new RenamedEventHandler(watcher_Renamed);
watcher.EnableRaisingEvents = true;
}
void watcher_Renamed(object sender, RenamedEventArgs e)
{
Thread th = new Thread(() =>
{
Clipboard.Clear();
});
th.IsBackground = true;
th.SetApartmentState(ApartmentState.STA);
th.Start();
}
希望有所帮助:)