【问题标题】:C# Console Application with a form on the side displaying live dataC# 控制台应用程序,侧面显示实时数据
【发布时间】:2016-11-03 14:24:33
【问题描述】:

我有一个控制台应用程序,它从数据库中获取实时数据,并对其进行实时操作,我的 Main 方法的大部分都在一个 while(true) 循环内。我需要一个在后台显示循环期间可用数据的一部分的表单。每次程序完成显示新值的循环时,我都希望它刷新。我在我的项目中添加了一个表单,并将以下代码添加到我的初始化部分:

DataDisplay dataDisplay = new DataDisplay();
dataDisplay.Show();

在 Main 声明之上。 这会使窗口弹出,但每当我将鼠标悬停在它上面时,我的光标就会变成 M​​icrosoft 加载蓝色圆圈。我的程序的其余部分运行良好,当前功能仍然存在,只是形式不满意。

的变体
Application.Run(dataDisplay);
dataDisplay.ShowDialog();

由于应用程序没有结束,导致我的程序挂在上面的行而不进入 while 循环。

我还没有开始构建填充表单的功能,因为它似乎不想表现出来。

我做错了什么,我对 C# 和 Winforms 都比较陌生。

【问题讨论】:

  • 您必须使用BackgroundWorker 作为数据检索部分。如果我理解正确,你的主窗体中有一个无限循环,所以主线程很忙,不能在你的第二个窗体中绘制任何东西
  • 没有理由使用 BGW,它已经过时了。使用 Task.Run 从表单内部运行长时间运行的作业,并使用 Progress<T> 向表单发送消息
  • 您可能会考虑写入控制台而不是表单。您可以写入窗口的特定区域,而不必让所有内容滚动。
  • 好吧,如果您像我在某些项目中一样坚持使用 .net 3.5,则必须使用 BGW。但你是对的,最好使用 Task :)

标签: c# winforms


【解决方案1】:

您正在阻塞主线程,这就是 gui 无法更新或对任何用户输入做出反应的原因。我建议将 while(true) 循环移到不同的线程。

这是一个简短的例子:

class MyForm : Form
{
    public Label label;

    public MyForm()
    {
        label = new Label();
        this.Controls.Add(label);
    }
}

class Program
{
    static void Main(string[] args)
    {
        MyForm f = new MyForm();

        (new Task(() =>
        {
            //your loop
            while (true)
            {
                f.Invoke(new Action(() =>
                {
                    f.label.Text = (new Random()).Next().ToString();
                }));
                Console.WriteLine("working...");
                Thread.Sleep(500);
            }
        })).Start();

        f.ShowDialog(); //blocks as long as the form is open
    }
}

【讨论】:

  • 为了避免混淆,我将代码改为显示随机数。
  • 感谢您的解决方案!
猜你喜欢
  • 1970-01-01
  • 2020-01-21
  • 2011-04-04
  • 2015-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-20
  • 1970-01-01
相关资源
最近更新 更多