需要帮助访问剪贴板工作从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());
        }
    }
}

需要帮助访问剪贴板工作从MTA应用程序

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

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

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

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