কলিং থ্রেডটি অবশ্যই এসটিএ হওয়া উচিত, কারণ অনেকগুলি ইউআই উপাদান এটির প্রয়োজন


174

আমি http://www.codeproject.com/KB/IP/Facebook_API.aspx ব্যবহার করছি

আমি এক্সএএমএলকে কল করার চেষ্টা করছি যা ডাব্লুপিএফ ব্যবহার করে তৈরি করা হয়েছে । তবে এটি আমাকে একটি ত্রুটি দেয়:

কলিং থ্রেডটি অবশ্যই এসটিএ হওয়া উচিত, কারণ অনেকগুলি ইউআই উপাদান এটির প্রয়োজন।

আমি কি করতে হবে তা জানি না. আমি এটি করার চেষ্টা করছি:

FacebookApplication.FacebookFriendsList ffl = new FacebookFriendsList();

তবে এটি আমাকে ত্রুটি দিচ্ছে।

আমি একটি ব্যাকগ্রাউন্ড কর্মী যুক্ত করেছি:

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

উত্তর:


222

প্রেরক থেকে আপনার কোড চাওয়ার চেষ্টা করুন :

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

হ্যাঁ, আপনারা আমার জীবন বাঁচালেন !!
অ্যালেক্স ম্যাকম্যানস

11
এটিই আসল উত্তর। আপনি ডাব্লুপিএফ এর উইন্ডো বোকামি এ দিয়ে হ্যাক করতে পারেন।
অ্যান্ড্রু

7
এবং এর অনুরূপ, যদি আপনি এমভিভিএমএলাইট ব্যবহার করতে পারেন তবে আপনি ব্যবহার করতে পারেনDispatcherHelper.CheckBeginInvokeOnUI(Action action)
তিথিপ্পি

এই সমস্যাটি জটিল এবং হতাশ বলে মনে হয়েছিল তবে এই শটটি সত্যিই দুর্দান্ত! তোমাকে অনেক ধন্যবাদ !
কে লি

4
@ এন্ড্রু এটি বোকামি নয়, আপনি ব্যাকগ্রাউন্ড থ্রেড থেকে কেবল ইউআই থ্রেডে অ্যাক্সেস করার চেষ্টা করছেন।
ক্রুস্টি

139

যদি আপনি মূল থ্রেড থেকে কল করেন তবে আপনাকে অবশ্যই পূর্বের উত্তরে বর্ণিত মূল পদ্ধতিতে STAThread বৈশিষ্ট্যটি যুক্ত করতে হবে।

আপনি যদি পৃথক থ্রেড ব্যবহার করেন তবে এটি একটি এসটিএ (একক থ্রেডেড অ্যাপার্টমেন্ট) এ থাকা দরকার যা ব্যাকগ্রাউন্ড কর্মীদের থ্রেডের ক্ষেত্রে নয়। আপনাকে নিজের মতো করে থ্রেড তৈরি করতে হবে:

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

t.Start();

থ্রেডপ্রোক থ্রেডস্টার্ট প্রকারের প্রতিনিধি হিসাবে রয়েছে।


2
এই (এসটিএ ব্যবহার করে) এর পার্শ্ব প্রতিক্রিয়া কি সম্ভব?
লুই রাইস

10
এসটিএ হওয়ার প্রধান পার্শ্ব প্রতিক্রিয়া হ'ল এক সাথে সিওএম কলব্যাকগুলি সিরিয়ালযুক্ত করা হয়। আপনি যদি সিওএম কলব্যাক ব্যবহার না করে থাকেন তবে তা বিবেচনা করা উচিত নয়।
টিমোরস

আমার জীবন সংরক্ষিত! এটি একটি ডাব্লুপিএফ অ্যাপ্লিকেশনটিতে ব্যবহার করতে সক্ষম হয়েছিল যা দুটি পৃথক অ্যাপ্লিকেশনগুলির মধ্যে ইন্টিগ্রেশনের জন্য একটি স্থানীয় API এ হোস্ট করেছিল!
schizoid04

18

আপনি এটি চেষ্টা করতে পারেন

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

ধন্যবাদ। এটি ফর্মের পরিবর্তে অ্যাপ্লিকেশনকন্টেক্স ক্লাস ব্যবহার করার সময় সহায়তা করবে।
সাদ্দামবিনশেড

আমি অন্যান্য ফর্মের মতো একটি বোতামটি ক্লিক করা হলে আমি একটি নতুন ফর্মটি খুলছি। কোনও ধারণা কেন those স্থানগুলির মধ্যে কেবল একটির এই ত্রুটিটি ছুঁড়ে দেওয়া হচ্ছে?
পল ম্যাকার্থি

17

আমার সন্দেহ হয় যে আপনি কোনও ইউআই উপাদানটিতে একটি পটভূমি থ্রেড থেকে কলব্যাক পাচ্ছেন। আমি আপনাকে পরামর্শ দিচ্ছি যে আপনি ব্যাকগ্রাউন্ড ওয়ার্কার ব্যবহার করে সেই কল করুন কারণ এটি ইউআই থ্রেড সচেতন।

ব্যাকগ্রাউন্ড ওয়ার্কারের জন্য, মূল প্রোগ্রামটি [STAThread] হিসাবে চিহ্নিত করা উচিত।


1
আমি এটি উপরে হিসাবে যোগ করার চেষ্টা করেছি, তবে এটি এখনও আমাকে ত্রুটি দেয়: /
সি ..

আমি কোড সহ ফিমিলিয়ার নই। আপনি কি ডিবাগ করতে পারেন এবং ঠিক এই কারণে কোডের রেখাটি খুঁজে পেতে পারেন?
প্রীত সংঘ

3

কেবলমাত্র আপনার প্রোগ্রামটিকে [STAThread]অ্যাট্রিবিউট দিয়ে চিহ্নিত করুন এবং ত্রুটিটি চলে যায়! এটা যাদু :)


1

আমার জন্য, একটি নাল প্যারামিটার পাস হওয়ার কারণে এই ত্রুটি ঘটেছে। ভেরিয়েবলের মানগুলি পরীক্ষা করে কোড পরিবর্তন না করেই আমার সমস্যা স্থির করে। আমি ব্যাকগ্রাউন্ড ওয়ার্কার ব্যবহার করেছি।


-3

আপনি যদি বিদ্যমান থ্রেডে একটি নতুন উইন্ডো ইউআই বিবৃতি কল করেন তবে এটি একটি ত্রুটি ছুঁড়ে দেয়। এর পরিবর্তে মূল থ্রেডের ভিতরে একটি নতুন থ্রেড তৈরি করুন এবং নতুন সন্তানের থ্রেডে উইন্ডো ইউআই বিবৃতি লিখুন।


কীভাবে লিখবেন প্লিজ?
তুষার গুপ্ত - কুরিউস্তুশর
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.