首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在.Net压缩框架,C#中改进UI?

如何在.Net压缩框架,C#中改进UI?
EN

Stack Overflow用户
提问于 2010-11-26 03:56:39
回答 3查看 778关注 0票数 1

我的应用程序中有一些WinForms。

在一些表单上,我正在加载其他表单,这些表单有很多数据要显示。

所以当我点击一个按钮来加载这些表格时,需要9-10秒的时间来加载,

我想改善这一点。我听说过后台线程,但不知道如何使用它。

在按钮上单击意味着我应该做什么才能看到我的表单,并且处理是由后台线程完成的?

请指导我,以便我可以改善我的UI。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-11-26 04:23:19

让窗体立即显示应该是相当简单的,并且不需要后台线程。

我的猜测是,您是在加载表单之前检索所有数据,还是在加载表单的同一线程上检索数据。您应该能够使用检索其余数据(如ID)所需的数据调用表单。

然后,您只需要找到一种方法,使数据处理在创建表单的线程之外的线程上进行。

这可能不是最优雅的解决方案,但它可以完成工作。它使用System.Windows.Forms.Timer

代码语言:javascript
复制
    private void Form1_Load(object sender, EventArgs e)
    {
        timer1.Start();
    }

    private void timer1_Tick(object sender, EventArgs e)
    {
        timer1.Stop();
        //fill controls with data
    }

如果您有多个要检索的数据集,则可能需要考虑设置一个任务队列来检索每个集。

你怎么做都行。确保禁用任何在未加载数据时可能导致错误的按钮(或其他ui)。

编辑:需要注意的是,winform控件并不总是能很好地处理线程。System.Windows.Forms.Timer (与System.Timers.Timer相对)的优点在于,它可以很好地处理控件。

票数 0
EN

Stack Overflow用户

发布于 2010-11-26 04:23:13

BackgroundWorker很容易使用。主要是订阅DoWork事件,这是您将在单独线程中完成的工作的位置。您还可以订阅RunWorkerCompleted活动。这将在您的DoWork完成时引发。在此方法中,您只需绑定由DoWork方法获取的数据。

您可以使用DoWork事件参数在DoWork和RunWorkerCompleted之间传递数据。您还可以取消工作,还可以使用RunWorkerCompleted eventArg从DoWork中获取数据,还可以检查Error属性以进行异常处理。

如果您有大量数据,您可以使用批处理过程,以获取每个批处理的数据并将其显示在您的UI中。您可以显示将获取的记录总数和进度,1000条记录中的100条已加载,1000条记录中的200条已加载,等等,以便随时通知用户。您还可以提供一个取消选项,这样用户就可以停止获取。

在单击按钮时,您只需调用myBackgroundWorker.RunWorkerAsync()。这将调用你的DoWork处理程序,这将在一个单独的线程中完成,而不是主UI线程,这样你的UI就不会在后台工作者DoWork期间冻结。

后台工作人员还支持报告进度。

票数 0
EN

Stack Overflow用户

发布于 2010-11-26 04:43:59

如果您的问题是主窗体冻结,那么您需要的是在主窗体运行时收集单独线程上的数据。

要实现这一点,您可以这样做:

代码语言:javascript
复制
    BackgroundWorker worker;

    public Form1()
    {
        InitializeComponent();
        worker = new BackgroundWorker();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        worker.DoWork += new DoWorkEventHandler(worker_DoWork);
        worker.RunWorkerAsync();
    }

    void worker_DoWork(object sender, DoWorkEventArgs e)
    {
        //Collect data and open your second form here;
    }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4280467

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档