Çağıran iş parçacığı STA olmalıdır, çünkü birçok UI bileşeni bunu gerektirir


175

Http://www.codeproject.com/KB/IP/Facebook_API.aspx kullanıyorum

WPF kullanılarak oluşturulan XAML çağırmaya çalışıyorum . Ama bana bir hata veriyor:

Çağıran evre STA olmalıdır, çünkü birçok UI bileşeni bunu gerektirir.

Ne yapacağımı bilmiyorum. Bunu yapmaya çalışıyorum:

FacebookApplication.FacebookFriendsList ffl = new FacebookFriendsList();

Ama bana bu hatayı veriyor.

Bir arka plan çalışanı ekledim:

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...
}

Yanıtlar:


224

Kodunuzu dağıtım programından çağırmayı deneyin :

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

Evet, sizler hayatımı kurtardınız !!
Alex McManns

11
Bu gerçek cevap. Bununla WPF'nin pencere aptallığına hackleyebilirsiniz.
Andrew

7
Ve buna benzer, eğer MVVMLight kullanıyor olursanız kullanabilirsinizDispatcherHelper.CheckBeginInvokeOnUI(Action action)
TimothyP

Bu sorun karmaşık ve sinirli görünüyordu ama bu atış gerçekten harika! Çok teşekkür ederim !
Kay Lee

4
@Andrew Aptallık değil, sadece arka plan iş parçacığından UI iş parçacığına erişmeye çalışıyorsunuz.
Krusty

139

Ana iş parçacığından çağrı yaparsanız, önceki yanıtta belirtildiği gibi Main yöntemine STAThread özniteliğini eklemeniz gerekir.

Ayrı bir iş parçacığı kullanırsanız, arka plan çalışan iş parçacıkları için geçerli olmayan bir STA'da (tek iş parçacıklı daire) olması gerekir. İş parçacığını kendiniz oluşturmanız gerekir, şöyle:

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

t.Start();

ThreadProc, ThreadStart türünde bir temsilcidir.


2
(STA kullanarak) bunun yan etkisi olabilir mi?
Louis Rhys

10
STA olmanın ana yan etkisi, eşzamanlı COM geri çağrılarının seri hale getirilmesidir. COM geri aramalarını kullanmıyorsanız bunun bir önemi yoktur.
Timores

Hayatımı kurtardı! Bunu, iki farklı uygulama arasında entegrasyon için yerel bir API barındıran bir WPF uygulamasında kullanabildi!
schizoid04

18

Bunu da deneyebilirsin

// 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();  

Teşekkürler. Bu, Form yerine Applicationcontext sınıfını kullanırken yardımcı olacaktır.
SaddamBinSyed

Diğer birçok yerde yaptığım gibi bir düğmeye tıklandığında yeni bir form açıyorum. Neden bu yerlerden sadece birinin bu hatayı verdiğine dair bir fikrin var mı?
Paul McCarthy

17

Bir arka plan iş parçacığından bir UI bileşeni için bir geri arama almak şüpheli. Bu UI iş parçacığı farkında olduğu gibi bir BackgroundWorker kullanarak bu çağrı yapmanızı öneririz.

BackgroundWorker için ana program [STAThread] olarak işaretlenmelidir.


1
Yukarıdaki gibi eklemeyi denedim, ama yine de bana hata veriyor: /
C ..

Ben kod ile familliar değilim. Hata ayıklama ve buna neden olan kod satırını tam olarak bulabilir misiniz?
Preet Sangha

4

Sadece programınızı [STAThread]öznitelikle işaretleyin ve hata ortadan kalkar! bu sihirdir :)


1

Benim için bu hata, boş bir parametre iletildiği için oluştu. Değişken değerlerini kontrol etmek, kodu değiştirmek zorunda kalmadan sorunumu çözdü. BackgroundWorker kullandım.


-3

Varolan bir iş parçacığında yeni bir pencere kullanıcı arabirimi deyimi çağırırsanız, hata verir. Bunun yerine, ana iş parçacığının içinde yeni bir iş parçacığı oluşturun ve pencere alt kullanıcı deyimini yeni alt iş parçacığına yazın.


pls açıklamak nasıl yazılır?
Tushar Gupta - curioustushar
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.