PDA

View Full Version : سوال: Cancel کردن و Run کردن بلافاصله ی BackgroundWorker



Open-Source
شنبه 15 خرداد 1389, 12:10 عصر
من بوسیله BW یه Grid رو پر میکنم(تا اینجا مشکلی نیست).

میخوام وقتی رویداد TextChange از TextBox، اتفاق افتاد، عمل پر کردن که بوسیله BW انجام میشه Cancel شده بعد سطرهای Grid پاک بشه و بلافاصله با توجه به مقدار TextBox ، دوباره BW شروع به کار کنه.

من از این کد استفاده میکنم:

//TextBox1_TextChanged

bw.CancelAsync();//BackgroundWorker - Cancel
dgv.Rows.Clear(); // DataGridView.Rows.Clear
bw.RunWorkerAsync(); //BackgroundWorker - Run


کد بدون مشکل اجرا میشه و جواب میده؛ فقط اگه خیلی سریع توی TextBox یه مقداری رو وارد و خیلی سریع BackSpace بزنی؛ مثل اینکه BW هنوز Cancel نشده میخواد دوباره Run بشه و بعد این Error رو میده:

This BackgroundWorker is currently busy and cannot run multiple tasks concurrently.


حالا برای رفع این مشکل باید چه کار کرد؟:عصبانی++:
:متفکر:

Open-Source
شنبه 15 خرداد 1389, 16:25 عصر
من با قرار دادن اون تکه کد بالا توی Try-Catch مشکل Error رو حل کردم (یعنی فقط درد رو آروم کردم).
چرا این مشکل پیش میاد؟(یعنی درمان چیه؟).
:متفکر:

saed2006
شنبه 06 آذر 1389, 11:59 صبح
منم دقیقا همین مشکل رو دارم
کسی نمیدونه چجوری رفع میشه؟

dr_jacky_2005
شنبه 06 آذر 1389, 13:05 عصر
منم دقیقا همین مشکل رو دارم
کسی نمیدونه چجوری رفع میشه؟

از این دو تا استفاده کنید:



if(backgroundWorker1.IsBusy)




if(backgroundWorker1.CancellationPending)

saed2006
شنبه 06 آذر 1389, 13:16 عصر
خب منم همین کار رو کردم یعنی ابتدا متد cancel رو صدا زدم و توی ترد هم نوشتم که اگه کنسل شدی بیا بیرون
اما مشکل اینه که بلافاصله نمیاد بیرون شاید 20 ثانیه طول بکشه در حالی که پردازش های داخلش کمتر از یک ثانیه هست

dr_jacky_2005
شنبه 06 آذر 1389, 13:52 عصر
خب منم همین کار رو کردم یعنی ابتدا متد cancel رو صدا زدم و توی ترد هم نوشتم که اگه کنسل شدی بیا بیرون
اما مشکل اینه که بلافاصله نمیاد بیرون شاید 20 ثانیه طول بکشه در حالی که پردازش های داخلش کمتر از یک ثانیه هست
اینو تست کن


if (backgroundWorker1.IsBusy == true)
{

backgroundWorker1.CancelAsync();
while (backgroundWorker1.IsBusy == true)
{
backgroundWorker1.CancelAsync();
}

backgroundWorker1.Dispose();

}

backgroundWorker1.RunWorkerAsync();

saed2006
شنبه 06 آذر 1389, 13:59 عصر
این


'At file level:
Imports SysThread = System.Threading
Imports SysComps = System.ComponentModel

'...
'At form level:
Private mThread As SysThread.Thread

Private Sub BGWorker_DoWork( _
ByVal Sender As Object, _
ByVal E As SysComps.DoWorkEventArgs _
) Handles BGWorker.DoWork

mThread = SysThread.Thread.CurrentThread
Try
For X As Integer = 0 To 100
SysThread.Thread.Sleep(1000)
BGWorker.ReportProgress(X)
Next
Catch Ex As SysThread.ThreadAbortException
SysThread.Thread.ResetAbort()
End Try
End Sub

Private Sub BTNCancel_Click( _
ByVal Sender As Object, _
ByVal E As System.EventArgs _
) Handles BTNCancel.Click

If BGWorker.IsBusy AndAlso _
mThread IsNot Nothing Then
mThread.Abort()
mThread = Nothing
End If
End Sub
'At file level:
Imports SysThread = System.Threading
Imports SysComps = System.ComponentModel

'...
'At form level:
Private mThread As SysThread.Thread

Private Sub BGWorker_DoWork( _
ByVal Sender As Object, _
ByVal E As SysComps.DoWorkEventArgs _
) Handles BGWorker.DoWork

mThread = SysThread.Thread.CurrentThread
Try
For X As Integer = 0 To 100
SysThread.Thread.Sleep(1000)
BGWorker.ReportProgress(X)
Next
Catch Ex As SysThread.ThreadAbortException
SysThread.Thread.ResetAbort()
End Try
End Sub

Private Sub BTNCancel_Click( _
ByVal Sender As Object, _
ByVal E As System.EventArgs _
) Handles BTNCancel.Click

If BGWorker.IsBusy AndAlso _
mThread IsNot Nothing Then
mThread.Abort()
mThread = Nothing
End If
End Sub





یه روش برای بستن فوری ترد اما بعد از از بین رفتن ترد isbusy همچنان true میماند و مشکل همچنان باقی است
روشی رو گفتین برای برنامه من جواب نمیده

dr_jacky_2005
شنبه 06 آذر 1389, 14:22 عصر
این


'At file level:
Imports SysThread = System.Threading
Imports SysComps = System.ComponentModel

'...
'At form level:
Private mThread As SysThread.Thread

Private Sub BGWorker_DoWork( _
ByVal Sender As Object, _
ByVal E As SysComps.DoWorkEventArgs _
) Handles BGWorker.DoWork

mThread = SysThread.Thread.CurrentThread
Try
For X As Integer = 0 To 100
SysThread.Thread.Sleep(1000)
BGWorker.ReportProgress(X)
Next
Catch Ex As SysThread.ThreadAbortException
SysThread.Thread.ResetAbort()
End Try
End Sub

Private Sub BTNCancel_Click( _
ByVal Sender As Object, _
ByVal E As System.EventArgs _
) Handles BTNCancel.Click

If BGWorker.IsBusy AndAlso _
mThread IsNot Nothing Then
mThread.Abort()
mThread = Nothing
End If
End Sub
'At file level:
Imports SysThread = System.Threading
Imports SysComps = System.ComponentModel

'...
'At form level:
Private mThread As SysThread.Thread

Private Sub BGWorker_DoWork( _
ByVal Sender As Object, _
ByVal E As SysComps.DoWorkEventArgs _
) Handles BGWorker.DoWork

mThread = SysThread.Thread.CurrentThread
Try
For X As Integer = 0 To 100
SysThread.Thread.Sleep(1000)
BGWorker.ReportProgress(X)
Next
Catch Ex As SysThread.ThreadAbortException
SysThread.Thread.ResetAbort()
End Try
End Sub

Private Sub BTNCancel_Click( _
ByVal Sender As Object, _
ByVal E As System.EventArgs _
) Handles BTNCancel.Click

If BGWorker.IsBusy AndAlso _
mThread IsNot Nothing Then
mThread.Abort()
mThread = Nothing
End If
End Sub



یه روش برای بستن فوری ترد اما بعد از از بین رفتن ترد isbusy همچنان true میماند و مشکل همچنان باقی است
روشی رو گفتین برای برنامه من جواب نمیده

حساب کردن فیبوناتچی
نوشته شده توسط تیم ماکروسافت
بدون 20 ثانیه :چشمک:
آخرین پست رو نگاه کنید:
http://barnamenevis.org/forum/showthread.php?t=260180&page=2