gpt4 book ai didi

c# - 线程结束时启动方法

转载 作者:太空宇宙 更新时间:2023-11-03 20:13:19 24 4
gpt4 key购买 nike

我对线程处理还比较陌生,所以我不确定我是否正确地处理了这个问题。

在我当前的应用程序中,我有一个多选项卡式导航窗体,其中一些具有指向其他窗体的按钮,一些具有表格,而一些则两者兼有。在其中一个上,我有一个用于添加条目的按钮,以及一个显示通过存储过程提取的当天所有条目的表格。

当我将第二个窗体作为对话框打开时,很容易通过调用我创建的方法来刷新表格……但是,它运行起来很慢。相反,我开始将它作为另一个线程调用,它运行得非常快,但我似乎找不到在线程结束时调用该方法的方法。我搜索了一段时间,但没有找到可行的解决方案。

代码如下:

public static void ThreadProcAddEntry()
{
Application.Run(new AddEntry());
}

private void btnAdd_Click(object sender, EventArgs e)
{
System.Threading.Thread t = new Thread(new ThreadStart(ThreadProcAddEntry));
t.Name = "AddEntry";
t.Start();
}

public void GetMyEntries(string username)
{
using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["DB2"].ConnectionString))
{
using (SqlCommand cmd = new SqlCommand("SP_GetUserEntries", conn))
{
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add("@UserID", SqlDbType.VarChar).Value = username;
conn.Open();
cmd.ExecuteNonQuery();
SqlDataReader reader = cmd.ExecuteReader();

using (reader)
{
DataTable table = new DataTable();
table.Load(reader);
dgvMyEntry.DataSource = table;
dgvMyEntry.AllowUserToAddRows = false;
dgvMyEntry.ReadOnly = true;
dgvMyEntry.AutoResizeColumns();
dgvMyEntry.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
}
}
}

}

您如何建议我在线程结束时运行 GetMyEntries 方法,这在我单击 AddEntryForm 上的“提交”按钮时立即发生(在提交到 SQL 之后,运行一个 dispose 方法)?

最佳答案

我建议使用任务,如下所示:

await Task
.Run(() => ThreadProcAddEntry())
.ContinueWith(task => GetMyEntries(username));

这比使用原始线程或后台 worker 更简洁和可读。

GetMyEntries 将在 ThreadProcAddEntry 完成后立即运行。

有关任务并行库(异步/等待)的更多信息:http://msdn.microsoft.com/en-us/library/vstudio/hh191443.aspx

关于c# - 线程结束时启动方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18514040/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com