c# - 与 UI 对话的线程?

标签 c# multithreading winforms user-interface

我有这个代码:

private void buttonStart_Click(object sender, EventArgs e)
{
    Task.Factory.StartNew(() => GeneraListaCartelle())
        .ContinueWith(t => GeneraListaCartelleCompletata()
        , CancellationToken.None
        , TaskContinuationOptions.None
        , TaskScheduler.FromCurrentSynchronizationContext());
}

private void GeneraListaCartelle()
{
    try
    {
        ... some operation ....
    }
    catch (Exception err)
    {
        txtErrors.AppendText(err.Message);
    }
}

GeneraListaCartelleCompletata()
{
    ... process finished...
}

txtErrors 在“主”线程(UI)中。当我捕获到错误时,异步线程无法写入 UI 控件,并且我得到了一个无效的跨线程异常

我可以在线程内与 UI 对话吗?

最佳答案

如果您使用的是 WinForms,则需要在 UI 线程上调用您的方法,例如

catch (Exception err)
{
    if(this.InvokeRequired){
        Action<Exception> act = ((ex) => {
            txtErrors.AppendText(ex.Message);
        }); 
        this.Invoke(act, new object[] { err });
    }
    else{
        txtErrors.AppendText(err.Message);
    }
}

如果您使用的是 WPF,则需要

catch (Exception err)
{
    if(this.Dispatcher.CheckAccess()){
       txtErrors.AppendText(err.Message);
    }
    else {
           Action<Exception> act = ((ex) => {
            txtErrors.AppendText(ex.Message);
           }); 
        this.Dispatcher.Invoke(act, new object[] { err });
    }
}

关于c# - 与 UI 对话的线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16076510/

相关文章:

使用 Collections.sort 时 android.os.AsyncTask 中出现 java.lang.ArrayIndexOutOfBoundsException

Java : improve the smoothness of a slow thread animation?

c# - 使用 Windows 形式的命令行参数

c# - C# 中的控制台和 Windows 窗体

.net - Windows 10 桌面应用程序上的自定义标题栏颜色

c# - "Data at the Root Level is invalid"与 LoadXml

c# - 如果数字为零,则显示自定义字符的格式函数

c# - 使用 WebBrowser 类时奇怪的弹出行为

c++ - Thread Building Blocks 流程图 — 类似 limiter_node 的东西,不会丢弃消息

c# - 如何在列表中搜索距离小于 F 到 P 的项目而不搜索整个列表?