PDA

View Full Version : مشکل کار با background worker



HOSSEINONLINE7
پنج شنبه 31 مرداد 1392, 17:34 عصر
سلام من برای نمایش میزان کپی فایلها از بگراند ورکر و پروگرس بار استفاده کردم ولی کار نمیکنه و موقع کپی اطلاعات فقط فرم هنگ میکنه و اطلاعات کپی میشه و درصد کپی شدن را توی پرگرس بار نمایش نمیده ...


کدش را طوری نوشتم که در هر لحظه سایز فولدر مقصد که داره توش کپی میشه دریافت و برای تغییر مقدار پروگرس بار ارسال میشه .


راهنمایی بفرمایید :


private void backgroundWorker1_DoWork(DirectoryInfo source, DirectoryInfo destination)
{
if (!destination.Exists)
{
destination.Create();
}

// Copy all files.
FileInfo[] files = source.GetFiles();
foreach (FileInfo file in files)
{
file.CopyTo(Path.Combine(destination.FullName,
file.Name));
}

// Process subdirectories.
DirectoryInfo[] dirs = source.GetDirectories();
foreach (DirectoryInfo dir in dirs)
{
// Get destination directory.
string destinationDir = Path.Combine(destination.FullName, dir.Name);



// --------------------------------Get and Send Destination Size-----------------------
string[] dsize = System.IO.Directory.GetDirectories(@"d:\a", "*", (System.IO.SearchOption.AllDirectories));

backgroundWorker1.ReportProgress(dsize.Length);

// ------------------------------------------------------------------------------------


// Call CopyDirectory() recursively.
CopyDirectory(dir, new DirectoryInfo(destinationDir));



}
}



private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
pb1.Value = e.ProgressPercentage ;
}



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

CopyDirectory(src, dest);
backgroundWorker1.RunWorkerAsync();

تشکر:قلب:

mehrdad1991h
پنج شنبه 31 مرداد 1392, 19:47 عصر
اشتباه پیش رفتی خوب
ببین اینجا را

CopyDirectory(src, dest);
backgroundWorker1.RunWorkerAsync();


شما اومدی اول عملیات کپی را در برنامه ات شروع کردی
و بعد بکگراند ورکر را استارتش کردی
این بک گراند ورکر اصلا چی کاره میشه اینجا ؟
کپی را خود برنامه اصلیت مجبوره انجام بده دیگه
بک گراند ورکر کاری نمیکنه الان که ؟؟؟؟ اصلا هیچ ارگومانی هم بهش ارسال نکردی که... پس چجوری کار میخواد بکنه ؟
باید عملیات کپی را داخل بک گراند ورکر انجام بدی

بعد یه سوال دیگه با این تغییری که دادید
backgroundWorker1_DoWork(DirectoryInfo source, DirectoryInfo destination)
اصلا بهتون هیچ ایرادی نگرفته ؟

اخه اطلاعات را در بک گراند ورکر فقط به صورت ارگومان میشد ارسال کرد
اصلا این بکگراند ورکر کار میده بهت ؟

HOSSEINONLINE7
پنج شنبه 31 مرداد 1392, 22:29 عصر
دستت درد نکنه درست شد فقط یک مشکل هست :

وقتی برنامه داره کپی میکنه پرگرس بار روان نیست و برنامه کلا هنگه و هر چندین ثانیه یک تیکه بزرگ پرگرس بار پر میشه دوباره برنامه هنگ میکنه ...

esafb52
پنج شنبه 31 مرداد 1392, 23:36 عصر
یه آموزش خوب جناب استادجمشیدی در ان مورد داره که اگه ببینیش مشکلاتت کامل حل میشه تو امضاءش هست
موفق باشی

HOSSEINONLINE7
جمعه 01 شهریور 1392, 00:24 صبح
یه آموزش خوب جناب استادجمشیدی در ان مورد داره که اگه ببینیش مشکلاتت کامل حل میشه تو امضاءش هست
موفق باشی

دوست عزیز تشکر ولی من جناب استاد جمشیدی را نمیشناسم از کجا باید آموزششون را پیدا کنم ؟ سرچ کردم کسی به این نام پیدا نشد ...

کد من یک مشکل کوچک داره که من نفهمیدم .

کد کامل را میزارم شما یک بررسی کنید اگر مشکلی داره بگید :


private void backgroundWorker1_DoWork(DirectoryInfo source, DirectoryInfo destination)
{
if (!destination.Exists)
{
destination.Create();
}

// Copy all files.
FileInfo[] files = source.GetFiles();
foreach (FileInfo file in files)
{
file.CopyTo(Path.Combine(destination.FullName,
file.Name));
}

// Process subdirectories.
DirectoryInfo[] dirs = source.GetDirectories();
foreach (DirectoryInfo dir in dirs)
{
// Get destination directory.
string destinationDir = Path.Combine(destination.FullName, dir.Name);



// --------------------------------Get and Send Destination Size-----------------------

DirectoryInfo di = new DirectoryInfo(@"d:\a");
long dsize = di.EnumerateFiles("*.*", SearchOption.AllDirectories).Sum(fi => fi.Length);
dsize = dsize / 1024 / 1024;
backgroundWorker1.ReportProgress((int)dsize);

// ------------------------------------------------------------------------------------


// Call CopyDirectory() recursively.

backgroundWorker1_DoWork(dir, new DirectoryInfo(destinationDir));



}
}



private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
pb1.Value = e.ProgressPercentage ;
}




private void button3_Click(object sender, EventArgs e)
{

DirectoryInfo di = new DirectoryInfo(idmpath);
long u = di.EnumerateFiles("*.*", SearchOption.AllDirectories).Sum(fi => fi.Length);
u = u / 1024 / 1024;


pb1.Maximum = (int)u;

DirectoryInfo src = new DirectoryInfo(idmpath);
DirectoryInfo dest = new DirectoryInfo(@"d:\a");

backgroundWorker1_DoWork(src, dest);

}


}

این کد درست کار میکنه و عملیات انجام میشه ولی از شروع تاپایان عملیات فرم هنگ میکنه و پروگرس بار تیکه تیکه و به کندی پر میشه

esafb52
جمعه 01 شهریور 1392, 00:27 صبح
بفرما دوست عزیز
http://barnamenevis.org/showthread.php?200544-%D8%A2%D9%85%D9%88%D8%B2%D8%B4-Backgroundworker