C#.NET 4任务能否在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

我正在我的应用程序中使用任务类。这不是WPF应用程序!问题是在UI线程上是否有可能从任务体调用函数,如下所示:

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;
    }