0

我有一些使用一些 .net 程序集的窗口工作流。我正在从这些工作流窗口访问一些硬件。我通过虚拟目录方法在 IIS 上发布的 XYZ 服务对这一切都有帮助。现在我想从我的 .Net Web 应用程序中使用这些工作流。我做了一个 wcf 服务和一个 web 客户端。我的 wcf 服务(根据 Web 客户端请求)加载工作流(成功)并尝试执行。

问题是当我调用加载的工作流的执行时,它给出了异常“调用线程必须是 STA,因为许多 UI 组件都需要这个。”

4

2 回答 2

2

如果您从不是单线程单元线程的线程中使用 WinForms/WPF 对象,您将收到此异常。为了使用 WCF 服务中的这些对象,您需要创建一个新线程,将该线程上的单元状态设置为STA,然后启动该线程。

我的简单示例采用一个字符串并根据 WPF TextBox 的 SpellCheck 功能对其进行检查:

public bool ValidatePassword(string password)
{
    bool isValid = false;

    if (string.IsNullOrEmpty(password) == false)
    {
        Thread t = new Thread(() =>
        {
            System.Windows.Controls.TextBox tbWPFTextBox = new System.Windows.Controls.TextBox();

            tbWPFTextBox.SpellCheck.IsEnabled = true;
            tbWPFTextBox.Text = password;
            tbWPFTextBox.GetNextSpellingErrorCharacterIndex(0, System.Windows.Documents.LogicalDirection.Forward);

            int spellingErrorIndex = tbWPFTextBox.GetNextSpellingErrorCharacterIndex(0, System.Windows.Documents.LogicalDirection.Forward);

            if (spellingErrorIndex == -1)
            {
                isValid = true;
            }
            else
            {
                isValid = false;
            }

        });

        t.SetApartmentState(ApartmentState.STA);
        t.Start();
        t.Join();
    }

    return isValid;
}

您还可以参考这篇 SO 帖子: How to make a WCF service STA (single-threaded)

以及答案中的链接:http: //www.netfxharmonics.com/2009/07/Accessing-WPF-Generated-Images-Via-WCF

于 2013-08-28T21:29:48.027 回答
0

我找到了这个

STA线程

您也可以使用解决您的问题

[STAthread]
private void yourMethod()
{
//Call the execution here
}

或者尝试这样做:

private void yourMethod()
{
     Thread t = new Thread(here delegate your method where you call the execution);
     t.SetApartmentState(ApartmentState.STA);
     t.Start();
}
于 2017-01-18T15:15:37.177 回答