2013-07-25 67 views
0

我從服務引用收到一些數據。WCF(WPF)錯誤:調用線程必須是STA

結構f.e.如下所示:
我從服務引用(名稱空間:ServiceReference.Driver)中收到一些驅動程序數據
我的項目中的驅動程序數據的命名空間是'MyProject.Driver'。

DriverUserControl應該在MyProject.Driver的構造函數中創建。

public Driver(int id, string name, string telephone, string plate, 
        Dictionary<DateTime, TransportType> transportTypes, Division division) 
    { 
     this.id = id; 
     this.name = name; 
     this.telephone = telephone; 
     this.plate = plate; 
     this.transportTypes = transportTypes; 
     this.division = division; 
     userControl = new DriverUserControl(this); 
    } 

但是,當我來到這裏:

public DriverUserControl(Driver magnet) 
    { 
     InitializeComponent(); 

     this.magnet = magnet; 
     Render(); 
    } 

每當到達用戶控件的構造函數中出現以下錯誤「調用線程必須爲STA,因爲許多UI組件都需要這」顯示了。

因爲我從未在我的項目中的任何地方啓動線程,所以我不知道該如何將其設置爲STA。我猜這個servicereference被視爲一個線程,但是,是否有辦法將它改爲STA?

謝謝。

+0

你爲什麼要在'Driver'類中創建Usercontrol? – Jobo

+0

Driver'對象創建在哪裏? ServiceReference在這一切中的作用是什麼?它不清楚。 – YK1

+0

在哪個線程上調用Driver構造函數?您需要對其進行調試,以查看它是否爲主線程,以確定其ApartmentState是否爲STA,否則,您必須手動創建STA線程。 –

回答

1

您的控件如何實例化?它是在程序啓動時創建的,還是您正在監聽來自WCF服務的呼叫?

通常情況下,對於一個WPF或WinForm的應用程序的主線程已經是STA(你會發現請將STAThreadAttribute應用於主方法生成的代碼文件,如果你搜索),

所以我懷疑你爲了響應傳入的wcf呼叫而實例化您的控制。是對的嗎?

如果出現這種情況,則需要額外關注:Windows中的所有UI窗口都有線程關聯,這意味着只有創建它們的線程才允許與它們進行對話。通常只有通過主線程創建窗口或控件才能確保這一點。所以後臺線程不應直接觸及UI控件的成員。

因此,您需要確保您正在從主線程創建用戶控件。最簡單的方法來做到這一點: 如果您已經擁有訪問形式/窗口,用戶控件將被放置在,只需使用:

TheWindowHostingTheControl.Dispatcher.Invoke (or BeginInvoke, or one of the AsyncInvokes), passing in a delegate to the code that instances your control. that will cause the control to be created on the same thread that the host window has affinity for. 

你需要做同樣的事情,任何時候來自Web服務的傳入呼叫需要更新控件上的屬性(當然,那麼您可以使用與控件關聯的Dispatcher實例)。

這一切都基於假設您正在響應傳入的wcf調用。 (抱歉,如果我把你帶走了)。

+0

是的。驅動程序在WCF服務的回調中得到實例化。我試了一下,我讓你知道,如果它是固定的:) thx –

相關問題