PDA

View Full Version : فریز شدن فرم حتی با backgroundworker



mtsoft
پنج شنبه 17 اسفند 1391, 07:57 صبح
سلام خدمت همه اساتید محترم

من یه تری ویو دارم که قراره از بانک اطلاعاتی پر بشه . من نود هام رو به صورت متغیر گرفتم و در رویداد dowork بکگراند ورکر اونها رو از بانکم پر می کنم . حالا مشکل از جایی شروع میشه که می خوام این نود هارو به تری ویو اضافه کنم خوب داخل رویداد dowork که نمیشه چون دسترسی نداره . به صورت invoke هم استفاده کردم ولی بازم فرمم فریز میشه.
میشه من رو راهنمایی بفرمایید.

the king
پنج شنبه 17 اسفند 1391, 16:16 عصر
وقتی از BackgroundWorker استفاده می کنید معمولا نیازی به Invoke ندارید. اول مشخصه WorkerReportsProgress رو در اون BackgroundWorker تون
True کنید تا بتوانید از متد ReportProgress و رخداد ProgressChanged استفاده کنید :


backgroundWorker1.WorkerReportsProgress = true;


رخداد ProgressChanged در Thread فرم اجرا میشه و دسترسی اش به کنترل های روی فرم کامل ئه.
فرضا می توانیم برای درج کردن یک Node جدید، عنوان اون Node رو از یک فیلد ItemName در جدول بانک اطلاعاتی بخوانیم و به Thread اصلی فرم ارسال کنیم :

backgroundWorker1.ReportProgress(0, row["ItemName"]);


یا به هر طریق دیگری که با کد تون مطابقت داره اون یک عدد TreeNode جدید رو بسازید و برای درج کردن ارسال کنید :

TreeNode node = new TreeNode("Title");
backgroundWorker1.ReportProgress(0, node);


به هر حال پر شدن TreeView در Thread اصلی فرم انجام میشه اما هدف اینه که TreeView رو یکجا و یک مرحله ای پر نکنید،
چون سنگینی کار Thread اصلی رو مشغول نگه می داره و جلوی پردازش رخداد های عادی فرم رو می گیره. هر Node رو جداگانه
برای درج کردن ارسال کنید تا کل وقت Thread اصلی رو نگیرید.


private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
foreach (DataRow row in YourTable.Rows)
{
backgroundWorker1.ReportProgress(0, row["ItemName"]);
}
}


عمل درج کردن رو در رخداد ProgressChanged انجام خواهید داد، e.UserState همان پارامتر دومی است که با ReportProgress ارسال کرده بودید،
فرضا عنوان Node جدید یا اصلا خود Node جدید :

private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
treeView1.Nodes.Add(e.UserState.ToString());
}


یا :

private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
treeView1.Nodes.Add((TreeNode)e.UserState);
}

mtsoft
یک شنبه 20 اسفند 1391, 08:12 صبح
از جواب عالی و کاملتون واقعا متشکرم