PDA

View Full Version : سوال: عدم نمایش میزان پیشرفت عملیات بازیابی database هنگام استفاده از backgroundworker



rahmatipoor
پنج شنبه 03 تیر 1395, 18:59 عصر
دوستان سلام
من وقتی میخوام دیتابیس رو با استفاده از بک گراند وورکر ریستور کنم ، متد ریستور اصلا اجرا نمیشه
کد :

clsBackUp_Restore Mybk = new clsBackUp_Restore();
BackgroundWorker BGW_1;
//BackgroundWorker BGW_2;
bool RunningState = false;


public frmRestoreDataBase()
{
InitializeComponent();
BGW_1 = new BackgroundWorker();
//BGW_2 = new BackgroundWorker();

BGW_1.DoWork += new DoWorkEventHandler(_DoWork);
BGW_1.ProgressChanged += new ProgressChangedEventHandler(_ProgressChanged);
BGW_1.RunWorkerCompleted += new RunWorkerCompletedEventHandler(_RunWorkerCompleted );
BGW_1.WorkerReportsProgress = true;

//BGW_2.DoWork += new DoWorkEventHandler(_DoWork2);

}




private void btnRestore_Click(object sender, EventArgs e)
{
try
{
//اجرای عملیات در پس زمینه
BGW_1.RunWorkerAsync();
}

catch (Exception Exception)
{
Cursor.Current = Cursors.Default;
MessageBox.Show(Exception.Message, "عملیات بازگردانی فایل پشتیبان با خطا مواجه شد!");
}
}



void _DoWork(object sender, DoWorkEventArgs e)
{
RunningState = true;
BGW_1.ReportProgress(0);
Cursor.Current = Cursors.WaitCursor;

Mybk.Restor_MyDataBase(txtBackUpPath.Text.Trim());
RunningState = false;
}


void _ProgressChanged(object sender, ProgressChangedEventArgs e)
{
//محاسبه درصد پیشرفت عملیات
int Percent = 0;
while (RunningState)
{
Thread.Sleep(100);
Percent = Mybk.Calc_Backup_Restor_ProgressPercent();
if (Percent > 0)
progressBar1.Value = Percent;

}
}

void _RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
Cursor.Current = Cursors.Default;
progressBar1.Value = 100;

frmMessagBox Mymessage = new frmMessagBox();
Mymessage.Text = "بازیابی فایل پشتیبان";
Mymessage.Peygham = "عملیات بازیابی فایل پشتیبان با موفقیت انجام شد!";
Mymessage.ShowDialog();
this.Close();
}



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




BGW_1.ReportProgress(0);



وقتی این خط هست اصلا خط Mybk.Restor_MyDataBase(txtBackUpPath.Text.Trim()); اجرا نمیشه و سی پی یو به شدت مشغول میشه

توضیح این که با همین روش عملیات بک آپ رو انجام دادم و هیچ مشکلی نداره

mrprestige
پنج شنبه 03 تیر 1395, 22:04 عصر
سلام دوست من وقتت بخیر ، دوست من شما خاصیت WorkerReportsProgress مربوط به Backgroundworker رو برابر True ندادید ؟

rahmatipoor
جمعه 04 تیر 1395, 12:57 عصر
سلام خیلی ممنونم از لطف و توجهتون
خط 16 کد رو ببینید انجام دادم. true کردم.
همچنن توی پست قبلی گفتم که با همین کد عملیات بک آپ رو انجام میدم مشکلی نداره.
البته الآن مشکل رو متوجه شدم. قبلا هم که از بک گراند وورکر استفاده نمی کردم این مشکل باز بود. توی حالت بک آپ گیری میشه چند تا کانکشن به دیتابیس بر قرار کرد و دیتابیس جواب میده . اما برای ریستور فقط یک کانکشن میشه بر قرار کرد و چون اون تکه کدی که باید میزان پیشرفت عملیات رو از دیتابیس ( master ) بخونه ، قبلش یه کانکشن برقرار کرده ، دیگه کامند مربوط به عملیات ریستور نمیتونه ارتباط با دیتابیس برقرار کنه.
شما میدونید راه حل برطرف کردن این مشکل چیه ؟
یادم رفت بگم که من از Ado.net استفاده می کنم.

rahmatipoor
جمعه 04 تیر 1395, 16:35 عصر
از این کد هم برای ریستور کردن دیتابیس استفاده می کنم


public void Execute_Restore(string BackUpPath)
{
try
{
if (MyCn.State == ConnectionState.Closed)
{
MyCn.Open();
}

//Excute SQL

SqlCommand MyCmd;

MyCmd = new SqlCommand(@" use master
RESTORE DATABASE [Toomar] from DISK ='"
+ BackUpPath +
@"' with replace ;
ALTER DATABASE [Toomar] SET MULTI_USER ", MyCn);
MyCmd.CommandTimeout = 0;
MyCmd.ExecuteNonQuery();


//-------------------------------------------------------------------------
MyCn.Close();
MyCn.Dispose();

}
catch
{
MyCn.Close();
MyCn.Dispose();
}
}