需要帮助访问剪贴板工作从MTA应用程序
本文关键字:MTA 应用程序 工作 剪贴板 帮助 访问 | 更新日期: 2023-09-27 18:05:07
我只是将GUI应用程序从STAThread
更改为MTAThread
,因为它做了一些并行的背景工作。现在我遇到了从MTAThread
应用程序中访问剪贴板的问题。
我尝试自己创建一个专用的STA线程,失败了,然后尝试这个类https://stackoverflow.com/a/21684059/2477582,又失败了。
从点网框架源代码中我发现Application.OleRequired()
不匹配ApartmentState.STA
是引发ThreadStateException
的唯一条件。但是这与我的实现相匹配,尽管如此还是引发了异常!
没有VS调试器的测试让我从这里继续应用程序。. NET遇到一个未处理的异常"对话框,然后剪贴板包含正确的值!所以它工作,但我没有机会捕捉异常,因为它从一些无法识别的线程void直接引发到Application.Run(new MyMainform())
。
是我做错了什么还是。net行为在这里改变了?
Program.cs:
[MTAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
try
{
Application.Run(new ds_Main());
}
catch (System.Threading.ThreadStateException ex)
{
// It always falls out here
System.Diagnostics.Debug.WriteLine("ThreadStateException: " + ex.ToString());
}
}
ds_Main.cs, DataGridView KeyDown handler:
private void ds_ImportTableView_KeyDown(object sender, KeyEventArgs e)
{
if (e.Control && e.KeyCode == Keys.C)
{
string ll_CopyString = "foobar"; // some other stuff is here of course...
try
{
Thread l_StaThread = new Thread(() =>
{
// this prints: STA=?STA
System.Diagnostics.Debug.WriteLine(Application.OleRequired().ToString() + "=?" + System.Threading.ApartmentState.STA.ToString());
try
{
Clipboard.SetDataObject(ll_CopyString);
}
catch (Exception ex)
{
// It never catches here ...
System.Diagnostics.Debug.WriteLine("Exception in STA Delegate: " + ex.Message);
}
});
l_StaThread.SetApartmentState(ApartmentState.STA);
l_StaThread.Start();
}
catch (Exception ex)
{
// It doesn't catch here either ...
System.Diagnostics.Debug.WriteLine("Exception in STA Thread: " + ex.ToString());
}
}
}
虽然我仍然不知道这个问题的正确答案,但我宣布没有必要再回答了。
这是因为我发现多线程在STAThread属性的UI应用程序中也可以工作。
为了识别这一点,我做了综合测试,证明了在与UI交互/调用时的并行执行,因为它总是在我的应用程序中实现。我尝试MTAThread属性的原因是一个外部库的行为不像预期的那样,给人的印象是整个UI应用程序的整体单线程执行。
对于任何想知道类似问题的人,我非常理解你对这个话题的困惑。但我建议,在这里问问题之前先做综合测试,因为这里似乎对推理错误几乎没有容忍度。