PDA

View Full Version : ارسال Click چندین دکمه به Backgroundworkers



CSharpLovers
سه شنبه 11 بهمن 1401, 12:40 عصر
با درود و آروزی شادی برای همه دوستان.
ما در Background workers میایم و یک کار سنگین رو تعریف میکنیم که به صورت موازی انجام بشه و برنامه هنگ نکنه .
آیا میشه دستوراتی که در کلیک یک دکمه تعریف شده رو به Background workers فرستاد ؟
یعنی در یک فرم چندین دکمه داریم که ممکنه عملیاتشون سنگین باشه و کدهای مربوط به هر عملیات رو داخل دکمه بنویسیم و در backgroundWorker_DoWork مثلا با شرط تعریف کنیم که اگر از فلان دکمه پارامتری ارسال شد به صورت موازی انجام بده .
حالا با شرط یا هر روش استاندارد میشه این کار رو انجام داد یا برای هر دکمه باید یک backgroundWorker جداگانه تعریف بشه ؟
ممنون از دوستان عزیز

محمد رضا فاتحی
پنج شنبه 13 بهمن 1401, 10:10 صبح
با درود و آروزی شادی برای همه دوستان.
ما در Background workers میایم و یک کار سنگین رو تعریف میکنیم که به صورت موازی انجام بشه و برنامه هنگ نکنه .
آیا میشه دستوراتی که در کلیک یک دکمه تعریف شده رو به Background workers فرستاد ؟
یعنی در یک فرم چندین دکمه داریم که ممکنه عملیاتشون سنگین باشه و کدهای مربوط به هر عملیات رو داخل دکمه بنویسیم و در backgroundWorker_DoWork مثلا با شرط تعریف کنیم که اگر از فلان دکمه پارامتری ارسال شد به صورت موازی انجام بده .
حالا با شرط یا هر روش استاندارد میشه این کار رو انجام داد یا برای هر دکمه باید یک backgroundWorker جداگانه تعریف بشه ؟
ممنون از دوستان عزیز

سلام...می تونید یه متغیر تعریف کنید برای هر کلید و انو به عنوان پارامتر به backgroundWorker پاس بدین...و با یه سوئیچ-کیس اونو مدیریت کنید

CSharpLovers
پنج شنبه 13 بهمن 1401, 22:02 عصر
یک نمونه کد میگذارم ببینید صحیح هست این روش :

int BGW_btnClick; // تعریف متغیر برای ارسال رویداد دکمه ها به بک گراند ورکر

کدهای دکمه اول -------------------------------

private void btn7_Click(object sender, EventArgs e)
{
if (!backgroundWorker1.IsBusy)
{
BGW_btnClick = 1;
backgroundWorker1.WorkerReportsProgress = true;
backgroundWorker1.RunWorkerAsync();
frmWait frm = new frmWait();
frm.ShowDialog();
}
else return;
}

کدهای دکمه دوم -------------------------------


private void btnBn1_Click(object sender, EventArgs e)
{
if (!backgroundWorker1.IsBusy)
{
BGW_btnClick = 2;
backgroundWorker1.WorkerReportsProgress = true;
backgroundWorker1.RunWorkerAsync();
frmWait frm = new frmWait();
frm.ShowDialog();
}
else return;
}

کدهای backgroundWorker1_DoWork -----------------------------------

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
BindingSource bs = new BindingSource();


switch (BGW_btnClick)
{
case 1:
_PageSize = Convert.ToInt32(txtSearch3.Text);
bs.DataSource = _Data.GetListTblUnitPaging2(_PageNumber, _PageSize);
e.Result = bs;
break;
case 2:
if (txtSearch2.Text == "")
{
return;
}

bs.DataSource = _Data.GetUnitName(txtSearch2.Text);
e.Result = bs;
break;
case 3:
// HeaderTest();
bs.DataSource = _Data.GetDateTest(mskDate1.Text, mskDate2.Text);
e.Result = bs;
break;
}
}

کدهای backgroundWorker1_RunWorkerCompleted -------------------------------

private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{


// DataGridView dgv = new DataGridView();
bs = e.Result as BindingSource;


bn1.BindingSource = bs;
bn2.BindingSource = bs;
dgv.DataSource = bs;

if (dgv.RowCount != 0)
{
dgv.Rows[dgv.RowCount - 1].Selected = true;
dgv.CurrentCell = dgv.Rows[dgv.RowCount - 1].Cells[0];
}
}


در مجموع آیا این روش مناسبی هست یا اینکه بیایم مثلا برای این سه عملیات سه تا backgroundWorker جدا گانه تعریف کنیم ؟