我有一些使用某些.net程序集的窗口工作流程。我从这些工作流窗口访问一些硬件。我通过虚拟目录方法在IIS上发布的XYZ服务可以帮助实现这一目标。 现在我想从我的.Net Web应用程序中使用这些工作流程。我做了一个wcf服务和一个Web客户端。我的wcf服务(在Web客户端请求上)加载工作流(成功)并尝试执行。
问题是当我调用加载的工作流的执行时,它给出异常“调用线程必须是STA,因为许多UI组件需要这个。”
答案 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]
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();
}