【问题标题】:Thread Safe Windows Form App running on the command-line在命令行上运行的线程安全 Windows 窗体应用程序
【发布时间】:2014-01-09 21:45:57
【问题描述】:

我有一个可以从命令行以安静模式运行的 Windows 窗体应用程序。我在 CodeGuru.com 网站上找到了一个类,它将处理在异步线程上执行命令行进程。这是演示和源代码的链接。 http://www.codeguru.com/csharp/csharp/cs_misc/userinterface/article.php/c8503/Invoking-Command-Lines-Programmatically.htm#page-2

我已经单独测试了演示。当然,它有点旧,但它仍然有效。我正在尝试使其适应我的应用程序,但似乎有一个细微的差别导致我的应用程序因无效操作异常而崩溃 - 跨线程操作无效:控制从线程以外的线程访问的“editExitTime”它创建于。

演示应用程序从具有私有静态 Main 函数的 frmMain 启动。这样跑一切都很开心。当我将主函数移动到一个名为“程序”的类并启动表单时,它变得线程不安全。我在想我也许可以使用 rtb.invokerequired,但我在语法上遇到了问题。

【问题讨论】:

  • 有争议的解决方案:将行Control.CheckForIllegalCrossThreadCalls = true; 添加到程序初始化代码中,您的应用程序将在每次无效的跨线程操作时都会失败。然后使用Control.BeginInvokeControl.Invoke方法解决问题。

标签: c# winforms c#-4.0 thread-safety


【解决方案1】:

很容易使用,只需复制/粘贴以下内容

control.Invoke((Action)(() =>
{
    // put here some code to access control from other thread
    control.Text = "blablabla";
}));

其中control 是具有创建句柄的控件之一(因为整个 GUI 应该在一个线程中创建)。

您可能想了解更多关于Invoke/BeginInvoke 自己、InvokeRequiredHandleCreated 以及Anonymous delegateLambda 的信息,以充分了解 wtf 是 ^^ .

【讨论】:

    猜你喜欢
    • 2013-11-05
    • 2013-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多