需要帮助才能从MTA应用程序访问剪贴板

时间:2015-07-27 10:59:34

标签: c# clipboard sta mta

我正在将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());
        }
    }
}

1 个答案:

答案 0 :(得分:-1)

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

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

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

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