سلام
من با استفاده از backgroundworker يه ديتا تيبل سنگين رو پر ميکنم.
اما نميتونم موقعيت cancel بودن رو چک کنم .
کسی راه حلی داره ؟
سلام
من با استفاده از backgroundworker يه ديتا تيبل سنگين رو پر ميکنم.
اما نميتونم موقعيت cancel بودن رو چک کنم .
کسی راه حلی داره ؟
می تونید از خاصیت BGWorker.CancellationPending استفاده کنید....
Close your eyes, take a deep breath, click your heels three times, and say, "There's no better thing than Inversion of Control and Dependency Injection, generic specialization, the decorator pattern, chains of responsibilities, and extensible software."
سلام
اين مورد در صورتی پاسخ گو هست که ترد مشغول نباشه و هر لحظه امکان چک کردن اين ويژگی وجود داشته باشه.
اما زمانی که ديتا تيبل در حال پر شدن هست اين امکان وجود نداره.
خوب بله.اصولا شرط IsBusy هم چک میشه...
if(BGWorker.IsBusy)
{
BGWorker.CancelAsync();
this.Text="cancelling operation....";
}
Close your eyes, take a deep breath, click your heels three times, and say, "There's no better thing than Inversion of Control and Dependency Injection, generic specialization, the decorator pattern, chains of responsibilities, and extensible software."
سلام
امکانش هست يک مثال بزنيد ؟
من امتحان کردم ولی جوابی نگرفتم .
private void button_Click(object sender, EventArgs e)
{
if (bgWorker.IsBusy)
bgWorker.CancelAsync();
}
//
private void bgWorker_DoWork(object sender, DoWorkEventArgs e)
{
if (bgWorker.CancellationPending)
{
e.Cancel = true;
return;
}
}
//
private void bgWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
if (e.Cancelled)
this.Text = "cancelled";
}
Close your eyes, take a deep breath, click your heels three times, and say, "There's no better thing than Inversion of Control and Dependency Injection, generic specialization, the decorator pattern, chains of responsibilities, and extensible software."
سلام
یک راه سریع برای توقف هر ریسمانی وجود دارد که البته آخرین راه حل باید باشد!
متد Abort
private System.Threading.Thread m_Thread;
private void button_Click(object sender, EventArgs e)
{
System.Threading.Thread thread = this.m_Thread;
if (thread != null)
{
try
{
thread.Abort();
}
catch { }
}
}
private void bgWorker_DoWork(object sender, DoWorkEventArgs e)
{
this.Thread = System.Threading.Thread.CurrentThread;
//...
//anu code...
//...
this.Thread = null;
}
private void bgWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
this.Thread = null;
//...
//anu code...
//...
}
موفق باشید.
سلام
ممنون که راهنمايی ميکنيد !
امکانش هست که توضيحی در مورد نحوه کار کرد کد بديد ؟
سلام
توضیح خاص و پیچیده ای ندارد ...
هر ریسمان در دات نت یک کلاس دارد.
با شروع ریسمان جدید در قالب backgroundWorker و رویداد bgWorker_DoWork کلاس ریسمان را بدست آورده و در متغییری ذخیره میکنیم...
در پایان کار ریسمان هم این متغییر را خالی میکنیم.
سپس در متد لغو عملیات یا همان cancel اگر متغییر ریسمان خالی نباشد متد Abort را برای توقف سریع ریسمان اجرا میکنیم. (یک چیز تو مایه های EndTask !) کدهای اجرایی درون آن ریسمان در هر جایی باشند با خطای ThreadAbortException متوقف میشود.
(اون متغییر محلی داخل button_Click اضافی نیست و بهتر است بگذارید بماند!)
موفق باشید.