【问题标题】:Multithreaded Applications多线程应用程序
【发布时间】:2010-05-09 05:33:45
【问题描述】:

我一直在阅读 MSDN 上的文章,但我的思想已经死了(这通常发生在我阅读 MSDN 时(无意冒犯 MSDN,但您的文章有时会让我感到困惑。)),我正在尝试做一些“后台工作”在我的应用程序中,但不确定如何。这只是一个单一的方法。但是应用程序挂起,我必须等待最多 1 到 3 分钟才能使其...未挂起?

是否有任何简单的示例在网上某个地方我可以查看/玩弄?

谢谢大家

【问题讨论】:

  • 你是否从后台线程直接调用表单控件?
  • 我道歉,沃洛迪。这是我第一次尝试多线程。过去我从来不需要多线程。
  • @volody;现在我明白你的问题是什么意思了。没有。我不打算从后台线程调用任何表单控件。 :)

标签: c# .net winforms multithreading


【解决方案1】:

Jon Skeet 写了一篇不错的introduction to multithreading in .NET,您可能会读到。它还涵盖threading in WinForms。它可能会出现:

public partial class Form1 : Form
{
    private BackgroundWorker _worker;

    public Form1()
    {
        InitializeComponent();
        _worker = new BackgroundWorker();
        _worker.DoWork += (sender, e) =>
        {
            // do some work here and calculate a result
            e.Result = "This is the result of the calculation";
        };
        _worker.RunWorkerCompleted += (sender, e) =>
        {
            // the background work completed, we may no 
            // present the result to the GUI if no exception
            // was thrown in the DoWork method
            if (e.Error != null)
            {
                label1.Text = (string)e.Result;
            }
        };
        _worker.RunWorkerAsync();
    }
}

【讨论】:

  • 谢谢达林,我还在阅读你提到的 Jon Skeet 的文章。非常有趣和乐于助人。感谢您为我编写样本:) 非常感谢!我现在正在测试它。 :-)
【解决方案2】:

this decent question 已经有很多比 MSDN 更容易理解的文章链接。

Jon Skeet 的文章最容易上手,也可能是最全面的入门文章,Joe Duffy 的系列文章深入很多。在 Stackoverflow 中浏览 C# & Multithreading 标签也可以得到一些很好的答案。

您可能会发现避免使用 BackgroundWorker 是最快的方式,只需使用 Invoke:

void ButtonClick(object sender,EventArgs e)
{
    Thread thread = new Thread(Worker);
    thread.Start();
}

void Worker()
{
    if (InvokeRequired)
    {
        Invoke(new Action(Worker));
        return;
    }

    MyLabel.Text = "Done item x";
}

有些人喜欢在 Stackoverflow 上使用 BackgroundWorker,有些人则不喜欢(我在 2 号营地)。

【讨论】:

  • 哇,这看起来非常简单!还有我用来执行操作的代码......我只是把它放在 Worker() 方法中的任何地方吗?附言谢谢! :)
  • @j-t-s InvokeRequired 之后的任何位置,它只用于切换到 UI 线程,因此您可以更新控件而不会出现异常。
【解决方案3】:

达林已经告诉你这个理论了。

但是您应该检查静态ThreadPool.QueueUserWorkItem 方法。更方便。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多