C# 正在等待线程状态为“0”;“停止”;在按钮单击事件中
在按钮控件的C# 正在等待线程状态为“0”;“停止”;在按钮单击事件中,c#,multithreading,winforms,button,C#,Multithreading,Winforms,Button,在按钮控件的单击事件期间,我在等待线程状态时遇到一些问题。 每当我点击我的按钮,它就会执行下面的代码。 问题是它不会等到ThreadState被“停止”,因此它永远不会启用btnImportData或btnExportBellijst 我尝试了t.Join(),但这冻结了我的整个表单,我使用RichTextBox作为记录器,这样会导致记录器冻结几秒钟,然后立即显示大量文本。 我将ImportData函数放在另一个线程上的原因是保持表单运行,以便人们可以实时查看日志 单击我的按钮时我想要的: 更改
单击事件期间,我在等待线程状态时遇到一些问题。
每当我点击我的按钮,它就会执行下面的代码。
问题是它不会等到ThreadState
被“停止”,因此它永远不会启用btnImportData
或btnExportBellijst
我尝试了t.Join()
,但这冻结了我的整个表单,我使用RichTextBox
作为记录器,这样会导致记录器冻结几秒钟,然后立即显示大量文本。
我将ImportData
函数放在另一个线程上的原因是保持表单运行,以便人们可以实时查看日志
单击我的按钮时我想要的:
更改启用的一个或多个按钮的
在另一个线程上运行我的函数ImportData
,以便我的记录器可以保持日志记录。(void ImportData(){}
)
在我的功能完成后,更改启用的一个或多个按钮的
private void btnImportData_Click(object sender, EventArgs e)
{
//Disable current button
btnImportData.Enabled = false;
imgBonne.Visible = false; //random image
rtConsole.Visible = true; //RichTextBox logger
//Create a new thread for the button function
var t = new Thread(ImportData);
t.Start();
//It does NOT wait until thread stopped
while (t.ThreadState == ThreadState.Stopped)
{
//Never gets executed
btnImportData.Enabled = true;
btnExportBellijst.Enabled = true;
}
}
额外信息:按“导入数据”前的屏幕截图:
应用程序导入数据后的屏幕截图:
(编辑)目标框架:.NET framework 4
我最初使用下面的代码,但这会在按下“导入数据”后立即启用所有按钮
编辑:很抱歉,如果这是错误的分类,我想把它放在c#中。使用可以使它更容易:
private void btnImportData_Click(object sender, EventArgs e)
{
imgBonne.Visible = false; //random image
rtConsole.Visible = true; //RichTextBox logger
btnImportData.Enabled = false;
Task.Run(ImportData).ContinueWith((Task task) =>
{
btnImportData.Enabled = true;
btnExportBellijst.Enabled = true;
}, TaskScheduler.FromCurrentSynchronizationContext());
}
这可能会有帮助,谢谢!但是,我很抱歉,因为我忘了提到我使用的是.NETFramework4。我已经更改了任务。运行到Task.Factory.StartNew,但我似乎不知道如何继续工作:什么不工作?继续未执行?我在编译时出错:“委托”System.Action“不接受0个参数”,将“Task.Run”替换为“Task.Factory.StartNew”。(屏幕截图:绿线来自resharper,它们不是一个错误,只是一个建议)编辑:当鼠标悬停在红线上方时,它会显示出来。请尝试继续((任务任务)=>{code here})。编辑了我的答案
private void btnImportData_Click(object sender, EventArgs e)
{
imgBonne.Visible = false; //random image
rtConsole.Visible = true; //RichTextBox logger
btnImportData.Enabled = false;
Task.Run(ImportData).ContinueWith((Task task) =>
{
btnImportData.Enabled = true;
btnExportBellijst.Enabled = true;
}, TaskScheduler.FromCurrentSynchronizationContext());
}