PDA

View Full Version : سوال: فریز شدن فرم در backgroundWorker



si6arp
پنج شنبه 16 آذر 1391, 00:11 صبح
با سلام
من یک سری اطلاعات رو میخوام توسط backGroundWorker باند کنم توی یه گرید ویو . این کار انجام میشه اما بعد از لود شدن دیتا در گرید ویو , فرم هنگ میکنه و دیگه نمیشه باهاش کاری انجام داد . میشه یه راهنمایی بدید که چطور میشه ؟

mousa1992
پنج شنبه 16 آذر 1391, 00:16 صبح
سلام
برا این جور مشکلا باید کدتو هم بذاری دوستان ببینن و خطا رو پیدا کنن

si6arp
پنج شنبه 16 آذر 1391, 00:19 صبح
سلام
برا این جور مشکلا باید کدتو هم بذاری دوستان ببینن و خطا رو پیدا کنن


private void button4_Click(object sender, EventArgs e)
{
bckdataload.RunWorkerAsync();
}

private void bckdataload_DoWork(object sender, DoWorkEventArgs e)
{
dataset ds = Users.bindAll();
grid.datasource = ds.Tables[0];
}

در این حالت دیتا توی گرید لود میشه اما بلا فاصله فرم هنگ مینه

mousa1992
پنج شنبه 16 آذر 1391, 00:29 صبح
:متعجب: عزیز اول اینکه توی DoWork به اشیا thread اصلی نمیتونی دسترسی داشته باشی ینی اینکه کلا ترد ها با هم نمیتونن به صورت مستقیم ارتباط برقرار کنن و باید از deligate ها استفاده بشه که backgroundworker کار رو خیلی راحت کرده
فرضض بر این که بشه همچین کاری کرد اگه قرار اینجوری گرید رو پر کنی که از ترد دیگه نیازی نیست استفاده کنی
شما باید توی رویداد DoWork اطلاعات رو بگیری و درون یک دیتاتیبل بریزی و دستور پر کردن گرید رو توی RunWorkerCompleted بنویسی

mousa1992
پنج شنبه 16 آذر 1391, 00:34 صبح
نمونه کد :


private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
DataTable dt = new DataTable();
//... Fill dt from database
e.Result = dt;
}


private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
DataGridView dgv = new DataGridView();
dgv.DataSource = e.Result as DataTable;
}