我正在将GUI应用程序从STAThread
更改为MTAThread
,因为它执行一些并行后台工作。现在我遇到了从MTAThread
应用程序中访问剪贴板的问题。
我试图自己创建一个专用的STA线程,失败了,然后尝试了这个类https://stackoverflow.com/a/21684059/2477582并再次失败。
从dot net framework source code我发现Application.OleRequired()
不匹配ApartmentState.STA
是提升ThreadStateException
的唯一条件。
但这与我的实现相匹配,但异常却被提出了!
没有VS调试器的测试让我继续从这个" .NET遇到未处理的异常"对话框,然后剪贴板包含正确的值!所以它有效,但我没有机会捕获异常,因为它从一些不可识别的线程虚空直接引入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处理程序:
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());
}
}
}
答案 0 :(得分:-1)
虽然我仍然不知道这个问题的正确答案,但我宣布没有必要再回答它了。
这是因为我发现多线程在STAThread属性UI应用程序中也可以工作。
为了识别这一点,我进行了综合测试,证明了在与UI进行交互/调用时的并行执行,因为它始终在我的应用程序中实现。 我尝试MTAThread属性的原因是外部库的行为不符合预期,给人的印象是整个UI应用程序的整体单线程执行。
对于任何想知道类似问题的人,我对你对这个话题的困惑有深刻的理解。但我建议,在这里提出问题之前首先进行综合测试,因为似乎对推理错误的容忍度很低。