2010-02-24 47 views
109

Tôi đang sử dụng http://www.codeproject.com/KB/IP/Facebook_API.aspxCác thread gọi phải STA, vì nhiều thành phần giao diện người dùng yêu cầu này

Tôi cố gắng để gọi XAML mà được tạo ra sử dụng WPF. Nhưng nó cho tôi một lỗi:

The calling thread must be STA, because many UI components require this.

Tôi không biết phải làm gì. Tôi đang cố gắng thực hiện việc này:

FacebookApplication.FacebookFriendsList ffl = new FacebookFriendsList(); 

Nhưng điều đó gây ra lỗi cho tôi.

tôi đã thêm một nhân viên nền:

static BackgroundWorker bw = new BackgroundWorker(); 

static void Main(string[] args) 
{ 
    bw.DoWork += bw_DoWork; 
    bw.RunWorkerAsync("Message to worker"); 
    Console.ReadLine(); 
} 

static void bw_DoWork(object sender, DoWorkEventArgs e) 
{ 
    // This is called on the worker thread 
    FacebookApplication.FacebookFriendsList ffl = new FacebookFriendsList(); 

    Console.WriteLine(e.Argument);  // Writes "Message to worker" 

    // Perform time-consuming task... 
} 

Trả lời

15

Tôi nghi ngờ rằng bạn đang nhận được một cuộc gọi lại để một thành phần giao diện người dùng từ một sợi nền. Tôi khuyên bạn nên thực hiện cuộc gọi đó bằng cách sử dụng một BackgroundWorker vì đây là luồng UI.

Đối với BackgroundWorker, chương trình chính phải được đánh dấu là [STAThread].

+0

Tôi đã thử thêm nó, như trên, nhưng nó vẫn cho tôi lỗi:/ –

+0

Tôi không phải là familliar với mã. Bạn có thể gỡ lỗi thông qua và tìm ra chính xác các dòng mã gây ra điều này? –

121

Nếu bạn thực hiện cuộc gọi từ chuỗi chính, bạn phải thêm thuộc tính STAThread vào phương thức Chính, như đã nêu trong câu trả lời trước.

Nếu bạn sử dụng một sợi riêng biệt, nó cần phải ở trong một STA (căn hộ đơn luồng), mà không phải là trường hợp cho chủ đề công nhân nền. Bạn phải tự tạo chủ đề như sau:

Thread t = new Thread(ThreadProc); 
t.SetApartmentState(ApartmentState.STA); 

t.Start(); 

với ThreadProc là đại biểu loại ThreadStart.

+2

điều này có thể (sử dụng STA) có thể có tác dụng phụ không? –

+9

Tác dụng phụ chính của STA là các cuộc gọi lại đồng thời COM được tuần tự hóa. Nếu bạn không sử dụng gọi lại COM, nó không quan trọng. – Timores

-2

Nếu bạn gọi một tuyên bố giao diện người dùng cửa sổ mới trong một chuỗi hiện có, nó sẽ phát ra lỗi. Thay vào đó tạo một luồng mới bên trong luồng chính và viết câu lệnh UI cửa sổ trong chuỗi con mới.

+0

làm thế nào để viết xin giải thích? –

0

Đối với tôi, lỗi này xảy ra do thông số rỗng được chuyển. Kiểm tra các giá trị biến cố định vấn đề của tôi mà không cần phải thay đổi mã. Tôi đã sử dụng BackgroundWorker.

119

Cố gắng gọi mã của bạn từ dispatcher:

Application.Current.Dispatcher.Invoke((Action)delegate{ 

//your code 

}); 
+0

Yeahhh, các bạn đã cứu mạng tôi !! –

+6

Đây là câu trả lời * thực *. Bạn có thể hack đi tại cửa sổ của WPF ngu dốt với điều này. – Andrew

+5

Và tương tự như vậy, nếu bạn tình cờ sử dụng MVVMLight, bạn có thể sử dụng 'DispatcherHelper.CheckBeginInvokeOnUI (Hành động hành động)' – TimothyP

4

Bạn cũng có thể thử này

// create a thread 
Thread newWindowThread = new Thread(new ThreadStart(() => 
{ 
    // create and show the window 
    FaxImageLoad obj = new FaxImageLoad(destination); 
    obj.Show(); 

    // start the Dispatcher processing 
    System.Windows.Threading.Dispatcher.Run(); 
})); 

// set the apartment state 
newWindowThread.SetApartmentState(ApartmentState.STA); 

// make the thread a background thread 
newWindowThread.IsBackground = true; 

// start the thread 
newWindowThread.Start(); 
+0

Một chủ đề mới là không cần thiết, đơn giản gọi thread UI. – rolls

3

Application.Current.Dispatcher.Invoke ((Action) delegate {// đặt Mã đây });

+0

Điều này giống với câu trả lời này: https://stackoverflow.com/a/21539361/732673 –

Các vấn đề liên quan