Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/google-sheets/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 执行可以使用Windows窗体按钮取消的后台进程_C#_Multithreading_Winforms_Pass By Reference - Fatal编程技术网

C# 执行可以使用Windows窗体按钮取消的后台进程

C# 执行可以使用Windows窗体按钮取消的后台进程,c#,multithreading,winforms,pass-by-reference,C#,Multithreading,Winforms,Pass By Reference,我需要启动一个后台进程(解算器),它从我的主窗体(Form1)接收数据,并以新窗体(FormStatus)在ProgressBar中指示其进度。我决定从Form1启动FormStatus,然后在单独的线程中加载FormStatus以执行解算器进程。在解算器执行的任何时候,我都可以使用FormStatus中的ButtonStop中止它。如果直接启动,进程将阻止表单 若进程以按钮终止,则抛出异常,否则(若计算完成)解算器返回空字符串并关闭FormStatus 主窗体1的代码: 使用系统; 使用Sys

我需要启动一个后台进程(解算器),它从我的主窗体(Form1)接收数据,并以新窗体(FormStatus)在ProgressBar中指示其进度。我决定从Form1启动FormStatus,然后在单独的线程中加载FormStatus以执行解算器进程。在解算器执行的任何时候,我都可以使用FormStatus中的ButtonStop中止它。如果直接启动,进程将阻止表单

若进程以按钮终止,则抛出异常,否则(若计算完成)解算器返回空字符串并关闭FormStatus

主窗体1的代码:

使用系统;
使用System.Windows.Forms;
命名空间CS_线程
{
公共部分类Form1:Form
{
//包含一些数据
公共类CData
{public int{set;get;}}
私人CData数据;
公共表格1()
{
初始化组件();
data=newCDATA(){Int=100};
}
//在按钮上按open FormStatus启动解算器
私有无效按钮单击(对象发送者,事件参数e)
{
int结果;
使用(FormStatus f=新的FormStatus(数据))
{
f、 ShowDialog();
结果=f.结果;
}
//根据计算结果填写RTB箱
如果(结果<0)RTBox.Text=“失败”;
else RTBox.Text=“成功”;
}
}
}
FormStatus的代码:

使用系统;
使用系统线程;
使用System.Threading.Tasks;
使用System.Windows.Forms;
命名空间CS_线程
{
公共部分类FormStatus:表单
{
私有Form1.CData数据;
私有取消令牌源;
公共int结果{private set;get;}
公共表单状态(Form1.CData d)
{
初始化组件();
data=d;//没有找到传递类引用的更好方法。是否可以在Form1中公开此成员?
Result=-1;//表单关闭或进程终止时结果的默认值
source=新的CancellationTokenSource();
}
//在按钮停止时,按下停止解算器并关闭窗体
私有无效按钮停止单击(对象发送者,事件参数e)
{
source.Cancel();
Close();
}
//在表单加载启动求解器上:警告CS1998,这种异步方法缺少“等待”操作符并将同步运行。
私有异步void FormStatus_Load(对象发送方,事件参数e)
{
Task t=Task.Run(()=>Solver(data,this,source.Token));
字符串res=t.结果;
}
//解决方案:同一警告CS1998
专用静态异步任务求解器(Form1.CData数据、FormStatus f、CancellationToken ct)
{
尝试
{
//做一些计算
最大长=1000;
对于(长i=0;i
目前,我在FormStatus中有两个警告,该进程在Solver的第一次迭代时终止,并在“string res”中引发异常:System.InvalidOperationException:跨线程操作无效:从创建它的线程以外的线程访问控件“ProgressBar”


我刚刚开始使用线程,所以可能有一些非常愚蠢的东西…

您需要从后台线程调用一个主线程对象,比如表单本身。这将使主线程消息循环上的操作排队,并与其他消息一起按顺序执行。您正在阻止UI。。。当您不再在UI线程上时调用progressbar。