C# 从BackgroundWorker内部的剪贴板获取数据

C# 从BackgroundWorker内部的剪贴板获取数据,c#,backgroundworker,clipboard,C#,Backgroundworker,Clipboard,我有一个背景工作者,在DoWork方法中,我有以下内容: var clipboardData = Application.Current.Dispatcher.Invoke(new Action(() => { Clipboard.GetData(DataFormats.Serializable); })); 为什么即使我知道剪贴板上有正确格式的数据,也总是返回null?尝试将调用放入STA线程: object data = null; Thread t = new Thread(()

我有一个背景工作者,在DoWork方法中,我有以下内容:

 var clipboardData = Application.Current.Dispatcher.Invoke(new Action(() => { Clipboard.GetData(DataFormats.Serializable); }));

为什么即使我知道剪贴板上有正确格式的数据,也总是返回null?

尝试将调用放入STA线程:

object data = null;
Thread t = new Thread(() =>
{
    data = Clipboard.GetData(DataFormats.Serializable);
});
t.SetApartmentState(ApartmentState.STA);
t.Start();
t.Join();
// 'data' should be set here.
在具有“OnFinished”操作的方法中:

如果要显示和隐藏窗口,请尝试以下操作:

myWindow.Show();
GetClipboardData((data) =>
{
    // Do something with 'data'.
    myWindow.Close();
});
使用
ShowDialog()


如果只执行剪贴板.GetData(DataFormats.Serializable)操作,会返回什么?我怀疑这与调用后在线程内获得结果有关。如果不使用调用,则会出现异常:System.Threading.ThreadStateException:当前线程必须设置为单线程单元(STA)可以进行OLE调用之前的模式在BackgroundWorker中复制到剪贴板但添加调用时出现了相同的异常:
Application.Current.Dispatcher.invoke(新操作(()=>{clipboard.SetData(DataFormats.Serializable,theData);})您是否只需要在backgroundworker中从剪贴板获取数据,还是可以在调用RunWorkerAsync之前将其作为参数发送?我需要在backgroundworker中从剪贴板获取数据,因为这是时间密集型操作(可能是大量数据)。我基本上是从剪贴板粘贴的,当操作进行时,我会显示一个进度对话框。有没有办法知道线程何时完成?我试图在后台获取剪贴板数据,并在前台显示进度对话框。因此,我需要知道它何时完成才能关闭进度对话框。您可以设置一个
操作
并在线程内调用它,或者
t.Join()语句将阻塞,直到线程完成。我用一个完整的方法示例更新了我的帖子。我宁愿使用ShowDialog而不是Show,因为我不希望用户在这个过程中能够在GUI上做任何事情。但以这种方式使用ShowDialog时,显然会出现块。有什么想法吗?把
ShowDialog()
放到另一个线程中。更新了帖子。
GetClipboardData((data) =>
{
    // 'data' is set to the clipboard data here.
});
myWindow.Show();
GetClipboardData((data) =>
{
    // Do something with 'data'.
    myWindow.Close();
});
Thread d = new Thread(() =>
{
    myWindow.ShowDialog();
});
d.SetApartmentState(ApartmentState.STA);
d.Start();
GetClipboardData((data) =>
{
    // 'data' is set to the clipboard data here.
   myWindow.Close();
});