2013-03-21 60 views
0

我有一些使用某些.net程序集的窗口工作流程。我正在從這些工作流窗口訪問一些硬件。我通過虛擬目錄方法在IIS上發佈的XYZ服務幫助完成了這一切。 現在我想從我的.Net Web應用程序中使用這些工作流程。我做了一個wcf服務和一個web客戶端。我的wcf服務(在Web客戶端請求上)加載工作流程(成功)並嘗試執行。ASP.NET WCF服務錯誤「調用線程必須是STA,因爲很多UI組件都需要這個。」?

問題是當我調用加載工作流的執行時,它給出了異常「調用線程必須是STA,因爲很多UI組件都需要這個。」

回答

1

如果您使用的不是單線程單元線程的線程使用WinForms/WPF對象,您將得到此異常。爲了從您的WCF服務中使用這些對象,您需要創建一個新線程,將該線程上的公寓狀態設置爲STA,然後啓動該線程。

我簡單的例子接受一個字符串,並檢查其對一個WPF文本框的拼寫檢查功能:

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

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(); 
} 
相關問題