PDA

View Full Version : مبتدی: زمانگیر بودن انجام عملیات backgroudworker



shahin60
جمعه 28 شهریور 1393, 15:13 عصر
سلام من از یه backgroudworker تو برنامم استفاده کردم
حالا نمی دونم مشکلش چیه که خیلی طول میکشه تموم بشه، باید براش زمان تعریف کنم یا درسته؟
ممنون میشم راهنمایی کنید:

public Bkw()
{
InitializeComponent();

m_oWorker = new BackgroundWorker();
m_oWorker.DoWork += new DoWorkEventHandler(m_oWorker_DoWork);
m_oWorker.ProgressChanged += new ProgressChangedEventHandler(m_oWorker_ProgressChan ged);
m_oWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(m_oWorker_RunWorker Completed);
m_oWorker.WorkerReportsProgress = true;
m_oWorker.WorkerSupportsCancellation = true;
}



void m_oWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
//If it was cancelled midway
if (e.Cancelled)
{
lblStatus.Text = "محاسبه لغو شد";
}
else if (e.Error != null)
{
lblStatus.Text = "Error while performing background operation.";
}
else
{
Class_Msg.Msg_Save();
lblStatus.Text = "تکمیل محاسبات";
}
btn_save .Enabled = true;
btn_cancel.Enabled = false;
}



void m_oWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
//Here you play with the main UI thread
progressBar1.Value = e.ProgressPercentage;
lblStatus.Text = "لطفا چند دقیقه صبر کنید..." + progressBar1.Value.ToString() + "%";
}
//************************************************** ********************
void m_oWorker_DoWork(object sender, DoWorkEventArgs e)
{

for (int i = 0; i < 100; i++)
{

m_oWorker.ReportProgress(i);
mohasebe();
if (m_oWorker.CancellationPending)
{
e.Cancel = true;
m_oWorker.ReportProgress(0);
return;
}
}

m_oWorker.ReportProgress(100);
}





private void btn_save_Click(object sender, EventArgs e)
{
btn_save .Enabled = false;
btn_cancel.Enabled = true;
m_oWorker.RunWorkerAsync();


}


متد محاسبه mohasebe() متدی هست که اطلاعات 10000 نفر پردازش میکنه

Mahmoud.Afrad
جمعه 28 شهریور 1393, 17:42 عصر
بستگی به متد mohasebe داره. کد این متد رو بزار.

mohammad5530
جمعه 28 شهریور 1393, 18:28 عصر
به احتمال زیاد مشکل در متد محاسبه هست . این متد رو بزارید تا بررسی کنیم

موفق باشید

shahin60
جمعه 28 شهریور 1393, 23:16 عصر
چیز خاصی نیست چند تا for تو در توی
مثل این:

int sum1 = 0;
int sum2 = 0;
for (int i = 0; i < dt2.Rows.Count; i++)
{

for (int j = 0; j < dt5.Rows.Count; j++)
{
sum2 += int.Parse(dt5.Rows[j]["DAY"].ToString());
}
}

Mahmoud.Afrad
شنبه 29 شهریور 1393, 00:39 صبح
منطق کدتون چیه و چه نتیجه ای مد نظرت هست؟ با مثال توضیح بده.

اطلاعات از دیتابیس دریافت میشه؟ ساختار جداول و همچنین کوئری ای که نوشتی رو بزار.

lovee20002002
شنبه 29 شهریور 1393, 08:20 صبح
دوست عزیز متود رو نباید تو حلقه بزاری (mohasebe();) یک نگاه بنداز

for (int i = 0; i < 100; i++) {

m_oWorker.ReportProgress(i);
mohasebe();
if (m_oWorker.CancellationPending)
{
e.Cancel = true;
m_oWorker.ReportProgress(0);
return;
}

}
محاسبه رو داری 100 بار تکرار میکنی این اشتباه هست
حلقتو حذف کن و از e.result استفاده کن

shahin60
شنبه 29 شهریور 1393, 14:17 عصر
درسته اشتباه کردم
چطور از e.result استفاده کنم؟
چطوری بگم این متد چقدر طول میکشه؟آخه تعداد افراد هر دفعه متغیره ، بر اساس یه سری آیتم انتخابشون میکنه

shahin60
شنبه 29 شهریور 1393, 15:59 عصر
من 10000 مشتری دارم حالا بایه شرظ گفتم برا مشتری هایی که خرید بالای 100000 تومان تو ماه جاری دارن یه سری محاسبات بکنه
این ماه حدود 85640 نفر شدن
حالا میخوام چون محاسبات سنگینه و سیستم قفل میشه یه progressBar میزان پیشرفت کار رو نشون بده تا پردازش تموم بشه

lovee20002002
شنبه 29 شهریور 1393, 20:57 عصر
دوست من کمی سرچ کن نتیجه نداد بعد جواب میدن دوستان اینجا مشکل شما حل شد (http://barnamenevis.org/showthread.php?324810-%D9%85%D8%A7%D9%86%DB%8C%D8%AA%D9%88%D8%B1-%DA%A9%D8%B1%D8%AF%D9%86-%D9%85%D8%AA%D8%BA%DB%8C%D8%B1-%D8%AF%D8%A7%D8%AE%D9%84-%DB%8C%DA%A9-%DA%A9%D9%84%D8%A7%D8%B3-%DA%A9%D9%87-%D8%AA%D9%88%D8%B3%D8%B7-Background-Worker-%D8%A7%D8%AC%D8%B1%D8%A7-%D8%B4%D8%AF%D9%87&highlight=backgroudworker)ه