PDA

View Full Version : سوال: مشکلات احتمالی در backgroundWorker



sadaf_
چهارشنبه 03 اسفند 1390, 18:04 عصر
سلام
در event
backgroundWorker_DoWork
چه کدهایی باید بنویسیم
من کدی در event نوشتم که در نهایت گرید رو بایند می کنم
ولی وقتی به بایند می رسه error می ده
an exception of type system.NullRefrenceExeption...
یا وقتی می خوام کنترلی رو visible کنم error می ده
چرا؟

mostafaaa
چهارشنبه 03 اسفند 1390, 19:54 عصر
سلام
BackgroundWorker به شما اجازه میده که برخی از عملیاتهاتون رو در Thread جداگانه ای از Thread اصلی برنامه تون اجرا کنید.
درخواست های زمان بر مانند دانلود و برخی از Transaction های دیتابیس چون زمان بر هستن ممکن که UI برنامه تون Stop Response بشه برای همین در این گونه برنامه ها از Multithreading استفاده میشه.
نتیجه اینکه اگه با مباحث Multithreading آشنا باشید باید بدونید که از داخل یک Thread مستقیما نمیتونید به اشیا Thread دیگه دسترسی داشته باشید و با ارور Cross-thread مواجه میشید.
using System;
using System.ComponentModel;
using System.Windows.Forms;

namespace BackgroundWorkerSimple
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
backgroundWorker1.WorkerReportsProgress = true;
backgroundWorker1.WorkerSupportsCancellation = true;
}

private void startAsyncButton_Click(object sender, EventArgs e)
{
if (backgroundWorker1.IsBusy != true)
{
// Start the asynchronous operation.
backgroundWorker1.RunWorkerAsync();
}
}

private void cancelAsyncButton_Click(object sender, EventArgs e)
{
if (backgroundWorker1.WorkerSupportsCancellation == true)
{
// Cancel the asynchronous operation.
backgroundWorker1.CancelAsync();
}
}

// This event handler is where the time-consuming work is done.
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
BackgroundWorker worker = sender as BackgroundWorker;

for (int i = 1; i <= 10; i++)
{
if (worker.CancellationPending == true)
{
e.Cancel = true;
break;
}
else
{
// Perform a time consuming operation and report progress.
System.Threading.Thread.Sleep(500);
worker.ReportProgress(i * 10);
}
}
}

// This event handler updates the progress.
private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
resultLabel.Text = (e.ProgressPercentage.ToString() + "%");
}

// This event handler deals with the results of the background operation.
private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
if (e.Cancelled == true)
{
resultLabel.Text = "Canceled!";
}
else if (e.Error != null)
{
resultLabel.Text = "Error: " + e.Error.Message;
}
else
{
resultLabel.Text = "Done!";
}
}
}
}

اطلاعات بیشتر... (http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.aspx)

sadaf_
پنج شنبه 04 اسفند 1390, 09:52 صبح
با تشکر
می شه لطف کنین یک مثال برای select از دیتابیس و پر کردن اطلاعات در گرید و نشان دادن اتمام پردازش اطلاعات بگذارید
من خیلی در این خصوص گشتم ولی چیزی پیدا نکردم
ممنون