ASP.NET WCF服务错误“调用线程必须是STA,因为许多UI组件都需要这个。”?

时间:2013-03-21 07:07:09

标签: asp.net wcf iis-7 sta

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

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

2 个答案:

答案 0 :(得分:1)

如果您从一个不是单线程单元线程的线程中使用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;
}

你也可以参考这个S.O.职位: How to make a WCF service STA (single-threaded)

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

答案 1 :(得分:0)

我发现了这个

STAthread

您也可以使用

解决问题
[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();
}