PDA

View Full Version : سوال: نحوه کار کردن با thread ها در کلاس



se8820726
پنج شنبه 11 اردیبهشت 1393, 20:20 عصر
سلام
تو فرم ها وقتی میخواستیم یه thread ایجاد کنیم از کامپوننت backgroundWorker استفاده میکردیم که میتونستیم راحت پارامترهامونو از طریقش به تابعی که باید در یک thread جاداگانه اجرا بشه بفرستیم. همچنین یه event هم بنام RunWorkerCompleted داشت که وقتی thread متوقف میشد یا کارش تموم میشد اجرا میشد و کارهای لازم رو با توجه به مقدار بازگشتی انجام میداد.

خوب حالا از این component نمیشه تو یه کلاس استفاده کرد.
و از این نمونه کد استفاده میکنم:

using System.Threading;

public String f1()
{
Thread workerThread = new Thread(_f2);
workerThread.Start();


}


private void _p2()
{
// commands series 1

if (condition1) // must stop thread and returns some value

// commands series 2

if (condition2) // must stop thread and returns some value
}


خوب حالا اولین مشکل من اینه که اونجایی که condition1 چک میشه و مقدار true میگیره چطوری function _p2 رو خاتمه بدیم و مقداری رو برگردونیم ؟؟
همچنین این مشکل رو تو قسمت condition2 هم دارم.

دومین مشکل هم اینه که زمانی که function _p2 تموم میشه چجوری یه event فراخوانی کنم که نتیجه رو پردازش کنه ؟؟ (مثل رویداد RunWorkerCompleted تو فرم ها)

plus
پنج شنبه 11 اردیبهشت 1393, 23:10 عصر
شما توی کلاس ی که فرم نباشه هم میتونید از BackgroundWorker استفاده کنید.

using System.ComponentModel;

class Foo
{
BackgroundWorker backgroundWorker;
public void CreateAndRunWorker()
{
this.backgroundWorker = new BackgroundWorker();
backgroundWorker.DoWork += new DoWorkEventHandler(backgroundWorker_DoWork);
backgroundWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(backgroundWorker_Ru nWorkerCompleted);
backgroundWorker.RunWorkerAsync()
}

void backgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
// ...
}

void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
{
// ...
}
}

se8820726
شنبه 13 اردیبهشت 1393, 13:26 عصر
حالا یه سوال دیگه
من دوتا فرم بنام frm1 و frm2 دارم و یه کلاس بنام WebMethods

حالا هر کدوم از این فرم ها جداگانه متد test از WebMethods رو فراخونی میکنند که این متد یه BackgroundWorker ایجاد میکنه
حالا من چطوری وقتی کار BackgroundWorker تموم شد بتونم به فرمی که کلاس WebMethods رو فراخونی کرده بود نتیجه رو خبر بدم ؟؟


public partial class frm1 : Form
{
private WebMethods wm;


public frm1()
{
InitializeComponent();
}


private void button_Click(object sender, EventArgs e)
{
wm = new WebMethods();
wm.test();
}
}


public partial class frm2 : Form
{
private WebMethods wm;


public frm2()
{
InitializeComponent();
}


private void button_Click(object sender, EventArgs e)
{
wm = new WebMethods();
wm.test();
}
}


کلاس WebMethods:

class WebMethods
{
private BackgroundWorker backgroundWorker;


public void stop(){
backgroundWorker.CancelAsync();
}


public void test()
{
if (backgroundWorker.IsBusy != true)
{
this.backgroundWorker = new BackgroundWorker();
backgroundWorker.WorkerSupportsCancellation = true;
backgroundWorker.DoWork += new DoWorkEventHandler(_PostRequest);
backgroundWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(_PostRequestComplet ed);
backgroundWorker.RunWorkerAsync();
}
}


private void _PostRequest(object sender, DoWorkEventArgs e)
{
// ...
}


private void _PostRequestCompleted(object sender, RunWorkerCompletedEventArgs e)
{
// ...
}
}

plus
یک شنبه 14 اردیبهشت 1393, 00:36 صبح
شما باید یک event برای کلاس تعریف کنید و هموننطور که BackgroundWorker رویداد RunWorkerComplete رو raise میکنه کلاس شما هم رویداد تعریف شده رو raise کنه.
برای اینکه بدونید چطور یک Event ایجاد کنید در همین فروم یا گوگل جستجو کنید.

unrealword
پنج شنبه 18 اردیبهشت 1393, 23:10 عصر
دوست من اگر به نتیجه رسیدی کد فیکس شده رو اینجا قرار بدی ممنون می شم
من هم همین مشکل رو دارم
با تشکر