PDA

View Full Version : استفاده از background worker و progress bar



barman_kian
سه شنبه 11 تیر 1398, 17:32 عصر
سلام دوستان
من بعد از کلی جستجو باز هم متوجه نشدم چطوری میشه به صورت صحیح از background worker استفاده کرد
به طور مثال الان من از این کد دارم استفاده می کنم برای ارسال فایل به یک کانال تلگرامی :

OpenFileDialog ofd = new OpenFileDialog();
ofd.Filter = "Picture Files|*.jpg";
ofd.FileName = String.Empty;
DialogResult result = ofd.ShowDialog();
if (result == DialogResult.OK)
{
filename = System.IO.Path.GetFileName(ofd.FileName);
path = System.IO.Path.GetDirectoryName(ofd.FileName);
byte[] file = System.IO.File.ReadAllBytes(path + "" + filename);
telegram.file_send(file, filename);
}


خب این کد به درستی کار می کنه اما وقتایی که فایل بزرگه اتفاقی که میفته اینه که برنامه هنگ می کنه تا زمانیکه پروسس کامل بشه
الان من میخوام دو تا چیز رو یاد بگیرم ...
اول اینکه اگر بشه با استفاده از background worker این عملیات رو انجام بدم و وضعیت پروسس کار رو هم توی یک progress bar نشون بدم
دوم اینکه برای زمان هایی که نمی خوام زیادی کاربر درگیر بشه یک پیام بدم که کار انجام شد و در واقع کار خودش در پس زمینه انجام بشه و کاربر رو معطل نکنه

ممنون میشم راهنمایی کنید تا قدم به قدم کار جلو بره
خودم کلی جستجو کردم به نتیجه مطلوب نرسیدم

barman_kian
چهارشنبه 12 تیر 1398, 10:39 صبح
از اساتید کسی نبود راهنمایی کنه یا حداقل لینک آموزشی چیزی بگذاره
متشکرم

barman_kian
چهارشنبه 12 تیر 1398, 11:55 صبح
دوستان این رو پیدا کردم

private void button1_Click_1(object sender, EventArgs e)
{
bgw.DoWork += new DoWorkEventHandler(bgw_DoWork);
bgw.ProgressChanged += new ProgressChangedEventHandler(bgw_ProgressChanged);
bgw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bgw_RunWorkerComple ted);
bgw.WorkerReportsProgress = true;
bgw.RunWorkerAsync();
}
void bgw_DoWork(object sender, DoWorkEventArgs e)
{
int total = 57; //some number (this is your variable to change)!!

for (int i = 0; i <= total; i++) //some number (total)
{
System.Threading.Thread.Sleep(100);
int percents = (i * 100) / total;
bgw.ReportProgress(percents, i);
//2 arguments:
//1. procenteges (from 0 t0 100) - i do a calcumation
//2. some current value!
}
}

void bgw_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
progressBar1.Value = e.ProgressPercentage;
label1.Text = String.Format("Progress: {0} %", e.ProgressPercentage);
label2.Text = String.Format("Total items transfered: {0}", e.UserState);
}

void bgw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
//do the code when bgv completes its work
}


خب الان یعنی اون کد خودم رو باید درون dowork بگذارم درسته ؟؟
بعد چطوری به progress bar بفهمونم که عملیات به اتمام رسیده؟؟
ممنون میشم راهنمایی بفرمایید
متشکرم

محمد رضا فاتحی
چهارشنبه 12 تیر 1398, 14:12 عصر
سلام
رخداد RunWorkerCompleted زمانی زخ میده که کارتون تموم شده باشه(تابع doworkکارش تموم بشه)
شما هرکاری که قراره بعد از اتمام عملیاتتون رخ بده رو تو این تابع بنویسید