سلام
دوستان عزیز سی شارپ کار گل، خسته نباشید.
راستش من زیاد تو پروژه های Win32 Form C#‎‎‎‎‎‎‎.Net کار نکردم، اکثراً اگه با دات نت هم کار داشتم با وب سرویس ها کار داشتم تا UI و ...
بگذریم، می خواستم ببینم چطوری میشه برای Synchronize استفاده کردن (یا بقول دات نت ها Thread-safe کردن) عناصر روی فرم از BackgroundWorker استفاده کرد؟ تو اینجا یه توضیحاتی در این زمینه داده ولی زیاد با کار من همخوانی نداره یا من درست متوجه نمیشم؛ دو تا راه حل اونجا پیشنهاد شده که یکیش توی خود Thread فرعی داره یه تابع Callback استفاده میکنه، که من اینکار رو نمیخوام بکنم و اون یکی هم از BackgroundWorker استفاده کرده و این بنظرم خیلی بهتر اومد ولی نتونستم implement اش بکنم؛ برای اینکه بهتر منظورم رو بگیرید (با اینکه ممکنه تکراری باشه ولی من پاسخ مناسب پیدا نکردم) : باید بگم من برای گرفتن محتویات چندین جدول و نوشتن همزمان log مراحل دچار مشکل شدم! یعنی کاری که خیلی راحت همیشه تو دلفی (بخاطر عادت به سینتکس اش) انجام میدم رو اینجا نمی تونم انجام بدم، کد مورد نظر (نمونه هست نه اصلی) می تونه به شکل زیر باشه که من از اساتید محترم میخوام قسمت کامنت شده رو دقت کنند، اون خط قرمز جایی هست که به مشکل برخوردم و نتونستم ادامه بدم :

        // lstboxLogs = Is a ListBox to log events.
private void addLog(object log)
{
string msg = string.Format("{0:F} > {1}", DateTime.Now, log);
lstboxLogs.Items.Add(msg);
}

// cbTablesName = A ComboBox contain Table(s) name
// GetHotBillTableContents = A WebMethod return Dataset by TableName
// dataGV = A DataGridView for show Dataset contains.
private void update_sql_tables()
{
for (int idx = 0; idx < cbTablesName.Items.Count - 1; idx++)
{
addLog("Fetch Table <" + cbTablesName.Items[idx].ToString() + "> Contents ...");
DataSet setting_ds = hotbill.GetHotBillTableContents(cbTablesName.Items[idx].ToString());
addLog(string.Format("Table <{0}> have [{1}] records.",
cbTablesName.Items[idx].ToString(),
setting_ds.Tables[0].Rows.Count));
if (setting_ds.Tables.Count > 0)
{
dataGV.DataSource = setting_ds.Tables[0];
dataGV.AutoResizeColumns();
Refresh();
Thread.Sleep(1000); // replace with a retardation procedur ...
}
}
}

private void btnUpdateSettings_Click(object sender, EventArgs e)
{
if (MessageBox.Show("Are you sure to update all tables?", "Warning",
MessageBoxButtons.YesNo,
MessageBoxIcon.Question,
MessageBoxDefaultButton.Button1) == DialogResult.Yes)
{
btnGetTables_Click(sender, e);

addLog(string.Format("{0} <{1}> {2}", "Start update", cbTablesName.Items.Count, "Tables"));
/*
Thread th = new Thread(new ThreadStart(update_sql_tables));
th.IsBackground = true;
th.Start();
*/
update_sql_tables(); // I want do this function in thread, and also log steps ...
}
}

فکر کنم تا جایی که میشد توضیحات درون کد هست، ولی بازم اگه نامفهوم بود بفرمایید تا بیشتر توضیح بدم ...

ممنون.