Chuỗi cuộc gọi phải là STA, vì nhiều thành phần UI yêu cầu điều này


174

Tôi đang sử dụng http://www.codeproject.com/KB/IP/Facebook_API.aspx

Tôi đang cố gắng gọi XAML được tạo bằng WPF . Nhưng nó cho tôi một lỗi:

Chuỗi cuộc gọi phải là STA, vì nhiều thành phần UI yêu cầu điều này.

Tôi không biết phải làm gì. Tôi đang cố gắng để làm điều này:

FacebookApplication.FacebookFriendsList ffl = new FacebookFriendsList();

Nhưng nó đang cho tôi lỗ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...
}

Câu trả lời:


222

Cố gắng gọi mã của bạn từ bộ điều phối :

Application.Current.Dispatcher.Invoke((Action)delegate{
      // your code
});

Yeahhh, các bạn đã cứu cuộc đời tôi !!
Alex McManns 30/03/2016

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

7
Và tương tự như vậy, nếu bạn tình cờ sử dụng MVVMLight, bạn có thể sử dụngDispatcherHelper.CheckBeginInvokeOnUI(Action action)
TimothyP

Vấn đề này có vẻ phức tạp và nản lòng nhưng ảnh này thực sự rất tuyệt! Cảm ơn bạn rất nhiều !
Kay Lee

4
@Andrew Không phải là ngu ngốc, bạn chỉ đơn giản là cố gắng truy cập vào luồng UI từ một luồng nền.
Krusty

139

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

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

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

t.Start();

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


2
điều này (sử dụng STA) có thể có tác dụng phụ?
Louis Rhys

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

Cứu cuộc đời tôi! Đã có thể sử dụng điều này trong một ứng dụng WPF lưu trữ API cục bộ để tích hợp giữa hai ứng dụng khác nhau!
schizoid04

18

Bạn cũng có thể thử điều 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();  

Cảm ơn. Điều này sẽ giúp khi sử dụng lớp Applicationcontext thay vì Form.
SaddamBinSeded

Tôi đang mở một hình thức mới khi một nút được bấm giống như tôi làm ở nhiều nơi khác. Bất cứ ý tưởng tại sao chỉ có một trong những nơi đó là ném lỗi này?
Paul McCarthy

17

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

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


1
Tôi đã thử thêm nó, như trên, nhưng nó vẫn báo lỗi: /
C ..

Tôi không quen thuộc với mã. Bạn có thể gỡ lỗi thông qua và tìm ra chính xác dòng mã gây ra điều này không?
Tăng trước

3

Chỉ cần đánh dấu chương trình của bạn với [STAThread]thuộc tính và lỗi sẽ biến mất! thật là kỳ diệu :)


1

Đối với tôi, lỗi này xảy ra do một tham số null được thông qua. Kiểm tra các giá trị biến đã khắc phục sự cố của tôi mà không phải thay đổi mã. Tôi đã sử dụng BackgroundWorker.


-3

Nếu bạn gọi một câu lệnh UI cửa sổ mới trong một luồng hiện có, nó sẽ báo 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 luồng con mới.


Làm thế nào để viết xin giải thích?
Tushar Gupta - curioustushar
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.