我正在写一个简单的Windows窗体应用程序,让我进入线程的东西摆动。到目前为止,我拥有的是工作,但我想要做的是将其全部包含在单独的类中,而不是直接在我的表单代码中。类中包含的线程
我有一个后台线程启动并从数据库中检索数据。然后我将这些数据显示在列表框中。
private delegate void UpdateListValues(List<ListBoxItem> itemList);
private void form_main_Shown(object sender, EventArgs e)
{
// Set the loading text.
list_selection.Items.Add(ListHelpers.LoadingItem());
// Start the data access on a seperate thread.
Thread worker = new Thread(GetInvoicingData);
worker.IsBackground = true;
worker.Start();
}
private void GetInvoicingData()
{
// Query database
List<ListBoxItem> values = DAC.GetInvoicingAccounts();
// Display results
BeginInvoke(new UpdateListValues(DisplayList), new object[] { values });
}
private void DisplayList(List<ListBoxItem> itemList)
{
// Display each result
list_selection.Items.Clear();
for (int i = 0; i < itemList.Count; i++)
{
list_selection.Items.Add(itemList[i]);
}
}
的问题是,在显示列表的方法,我将无法访问列表框(list_selection),因为它是窗体类的一部分。有没有人对我如何做到这一点有任何建议。
此外,我是新的线程,所以随时告诉我,我做的绝对是错误的。我只是用http://www.codeproject.com/Articles/23517/How-to-Properly-Handle-Cross-thread-Events-and-Upd这个例子来让我知道我现在的位置。
感谢
任何你没有使用'BackgroundWorker'的理由? –
请注意,Control.BeginInvoke“在创建控件的底层句柄的线程上异步执行委托”(来自MSDN),因此它在技术上位于同一线程中。 –
@BryanCrosby并非如我所说的那样,我只是跟着那篇文章而已。似乎有很多不同的方式来使用线程我不确定在哪种情况下使用哪一种。 –