PDA

View Full Version : مشکل با شی Background Worker



iebu12
جمعه 24 آبان 1392, 22:02 عصر
با سلام
من مشکلی با شی BackGround Worker ندارم. فقط نمی دونم چجوری باید زمان انجام کارم رو در بیارم که بتونم برای کاربر در مدت انجام کار با یک progress Bar میزان پیشرفت کار رو نشون بدم. منظورم اینکه که مثلا من عملیات کپی یک فایل حجیم رو با BackGroundWorker می دم. اما می خوام در حین انجام کار میزان پیشرفت کار رو هم به کاربر نشون بدم.اگه ممکنه با مثال بگید خیلی بهتره.

با تشکر

esafb52
شنبه 25 آبان 1392, 08:21 صبح
با سلام دوست عزیز ساده است معمولا از این آبجکت ها برای انجام کاری تکراری در یک حلقه استفاده میشه حالا اگر عملیاتت ویژگی مثل lenth (طول)داره از اون استفاده کن در غیر این صورت یه متغییر تعریف کن و هر بار ++ و اون رو ارسال کن

iebu12
یک شنبه 26 آبان 1392, 17:39 عصر
با سلام و تشکر
همانطور که گفتم در یک عملیات مثل کپی یک فایل حجیم یا بکاپ گیری از دیتا بیس عملیت تکراری ندارم در ضمن اگه از یک متغییر استفاده کنم و اونو افزایش بدم چجوری زمان کل عملیات رو بدست بیارم تا بتونم مثلا یک Progress Bar به کابربر نشون بدم؟

با تشکر

esafb52
یک شنبه 26 آبان 1392, 18:45 عصر
دوست عزیز هرچی راه خودش رو داره اگه قراره یک کوئری رو دیتابیس بزنی خب باید استایل پروگرس بارت رو تغییر بدی اما مثلا برای کپی میشه به نحوی کار کرد که عملیات رو با پروگرس بار نشون داد
مثلا

public static void CopyFile(string FileSource, string FileDestination, ProgressBar progressBar1)
{
int NumRead;
long FileLength;
System.IO.FileStream From = new System.IO.FileStream(FileSource, System.IO.FileMode.Open);
System.IO.FileStream To = new System.IO.FileStream(FileDestination,
System.IO.FileMode.CreateNew);
byte[] buffer = new byte[1024];
FileLength = From.Length;
progressBar1.Minimum = 0;
progressBar1.Maximum = (int)FileLength;
while (FileLength > 0)
{
System.IO.BinaryReader Reader = new System.IO.BinaryReader(From);
NumRead = Reader.Read(buffer, 0, 1024);
FileLength = FileLength - NumRead;
System.IO.BinaryWriter Writer = new System.IO.BinaryWriter(To);
Writer.Write(buffer, 0, NumRead);
FileInfo aaaa = new FileInfo(FileSource);
Int64 a = aaaa.Length;
Int64 a1 = a /= 1000;
//MessageBox.Show(a1.ToString());
progressBar1.Maximum = int.Parse(a1.ToString());
progressBar1.Value = progressBar1.Value + (NumRead /= 1000);

Writer.Flush();
}
From.Close();
To.Close();
if (progressBar1.Value > 99)
{
progressBar1.Value = 0;
MessageBox.Show("Copy Finished successfuly");
}
}

iebu12
یک شنبه 26 آبان 1392, 19:53 عصر
خیلی ممنون
منظورتون از استایل Progress bar چیه؟

esafb52
یک شنبه 26 آبان 1392, 20:42 عصر
با سلام مجدد ببنین بعضی از کارها طوری هستن که نمیشه زمانی خاصی رو براشون محاسبه کرد یا طول مشخصی ندارن پس با تغییر استایل پروگرس بار به Marquee میتونین تا زمانی که اون کار در حال انجام هست از این سبک استفاده کنین
موفق باشین

iebu12
یک شنبه 26 آبان 1392, 21:36 عصر
خیلی ممنون
اگه می تونستید نمونه فایل هم بزارید خیلی خوب میشد.

ولی به هر حال از وقتی که گذاشتید، بسیار ممنونم.

MKalami
دوشنبه 27 آبان 1392, 07:59 صبح
راه حلی برای اندازه گیری دقیق زمان اجزای یک عملیات سراغ ندارم
ولی میشه موردی زمان انجام عملیات رو محاسبه کرد.
مثلا در زمان کپی کردن یه فایل حجیم به جای اینکه از تابع System.IO.File.Copy استفاده کنید میتونید از Stream ها استفاده کنید تا بتونید عملیات کپی فایل حجیم رو به تعدادی عملیات کوچکتر تقسیم کنید و زمان اجرای اونها رو اندازه بگیرید.
مثلا یه فایل 10 گیگابایتی دارید و میخواید اونو کپی کنید. کافیه که زمان انتقال 10 مگ از این فایل رو انداره بگیرید و زمان به دست آمده رو ضربدر 1024 کنید.