C#.NET 4任务能否在UI线程上提供通知?
我正在我的应用程序中使用任务类。这不是WPF应用程序!问题是在UI线程上是否有可能从任务体调用函数,如下所示:C#.NET 4任务能否在UI线程上提供通知?,c#,.net,parallel-processing,C#,.net,Parallel Processing,我正在我的应用程序中使用任务类。这不是WPF应用程序!问题是在UI线程上是否有可能从任务体调用函数,如下所示: var task = new Task(() => DoSmth(1)); task.Start(); public void DoSmth(int arg) { //smth CallNotifFuncOnUIThread(() => Notify(1)); //smth ELSE CallNoti
var task = new Task(() => DoSmth(1));
task.Start();
public void DoSmth(int arg)
{
//smth
CallNotifFuncOnUIThread(() => Notify(1));
//smth ELSE
CallNotifFuncOnUIThread(() => Notify(2));//notify AGAIN
//smth ELSE
}
public void Notify(int arg)
{
progressBar1.Value = arg;
}
或者这个问题还有其他解决方案?我知道BackgroundWorker类,但是Tasks呢?您可以在DoSth()中调用其他方法
您也可以使用
任务。在任务完成处理后,继续使用(…)
执行某项任务…如果您有任务,可以通过提供正确的计划程序在gui线程上启动它:
Task.Factory.StartNew(() => DoSomethingOnGUI(), TaskScheduler.FromCurrentSynchronizationContext());
有了windows窗体和progressBar1组件,您可以使用TPL
IProgress
界面执行任务
private void Form1_Load(object sender, EventArgs e)
{
Progress<int> progress = new Progress<int>();
var task = Alg(progress);
progress.ProgressChanged += (s, i) => { UpdateProgress(i); };
task.Start();
}
public void Notify(int arg)
{
progressBar1.Value = arg;
}
public static Task Alg(IProgress<int> progress)
{
Task t = new Task
(
() =>
{
for (int i = 0; i < 100; i++)
{
Thread.Sleep(100);
((IProgress<int>)progress).Report(i);
}
}
);
return t;
}
private void Form1\u加载(对象发送方,事件参数e)
{
进度=新的进度();
var任务=Alg(进度);
progress.ProgressChanged+=(s,i)=>{UpdateProgress(i);};
task.Start();
}
公共作废通知(int参数)
{
progressBar1.Value=arg;
}
公共静态任务Alg(IProgress进度)
{
任务t=新任务
(
() =>
{
对于(int i=0;i<100;i++)
{
睡眠(100);
((i)进展)报告(i);
}
}
);
返回t;
}
用户界面通常为STA,请参见:
因此,为了从UI中的none UI线程执行某些操作,您需要以某种方式将msg注入线程
例如,请参见htis winform示例:
无论您使用什么UI,您都需要一个类似的系统。相关:是WPF吗?如果是这样,请使用一个,即
应用程序.Current.Dispatcher
,它将为您提供UI Dispatcher。当然,如果您想在后台处理的某个地方更新UI,如果您只想在最末尾更新它,请在继续中使用适当的调度器上下文。
private void Form1_Load(object sender, EventArgs e)
{
Progress<int> progress = new Progress<int>();
var task = Alg(progress);
progress.ProgressChanged += (s, i) => { UpdateProgress(i); };
task.Start();
}
public void Notify(int arg)
{
progressBar1.Value = arg;
}
public static Task Alg(IProgress<int> progress)
{
Task t = new Task
(
() =>
{
for (int i = 0; i < 100; i++)
{
Thread.Sleep(100);
((IProgress<int>)progress).Report(i);
}
}
);
return t;
}