-1

我只是将 GUI 应用程序从 更改为STAThreadMTAThread因为它执行一些并行后台工作。现在我遇到了从MTAThread应用程序中访问剪贴板的问题。

我尝试自己创建一个专用的 STA 线程,失败了,然后尝试了这个类https://stackoverflow.com/a/21684059/2477582并再次失败。

dot net framework source code我发现Application.OleRequired()不匹配ApartmentState.STA是 raise 的唯一条件ThreadStateException。但这与我的实现相匹配,尽管引发了异常!

没有 VS 调试器的测试让我从这个“.NET 遇到未处理的异常”对话框继续应用程序,然后剪贴板包含正确的值!所以它有效,但我没有机会捕捉到异常,因为它从一些无法识别的线程 void 直接引发到Application.Run(new MyMainform()).

我做错了什么还是 .NET 行为在这里改变了?

程序.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());
        }
    }
}
4

1 回答 1

-1

虽然我仍然不知道这个问题的正确答案,但我宣布没有必要再回答它了。

这是因为我发现多线程在 STAThread 属性的 UI 应用程序中也可以工作。

为了确定这一点,我进行了综合测试,证明了与 UI 交互/调用时的并行执行,因为它始终在我的应用程序中实现。我尝试 MTAThread 属性的原因是外部库的行为与预期不符,给人的印象是整个 UI 应用程序中的整体单线程执行。

对于任何想知道类似问题的人,我对您对这个话题的困惑有深刻的理解。但我建议,在这里提出问题之前先进行综合测试,因为似乎对推理错误几乎没有容忍度。

于 2015-07-28T08:52:28.183 回答