如何在.Net Compact Framework,C#中改进UI?

时间:2010-11-25 19:56:39

标签: c# .net compact-framework

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

在某种形式上,我正在加载其他需要显示大量数据的表单。

因此,当我点击按钮加载这些表格时,他们需要9-10秒才能加载

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

按钮上的方法单击我应该做什么,以便我可以看到我的表单,并且处理是由后台线程完成的?

请引导我,以便我可以改进我的用户界面。

3 个答案:

答案 0 :(得分:0)

BackgroundWorker易于使用。主要是你订阅DoWork活动,这是你将你的工作放在一个单独的线程中的地方。您还订阅了RunWorkerCompleted事件。当您的DoWork完成时,这将得到提升。 在这种方法中,您只需绑定DoWork方法提取的数据。

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

如果您有大量数据,则可以使用批处理流程来获取每批数据并将其显示在UI中。您可以显示将获取的总记录数量,并且已经加载了1000个中的100个,已经加载了1000个中的200个等,以便让用户知情。您还可以提供“取消”选项,以便用户可以停止提取。

在按钮单击中,您只需调用myBackgroundWorker.RunWorkerAsync()即可。 这将调用您的DoWork Handler,它将在一个单独的线程中完成而不是主UI线程,因此您的UI在后台工作者DoWork期间不会冻结。

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

答案 1 :(得分:0)

让表单立即显示,应该相当简单,并且您不需要后台线程来执行此操作。

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

然后你只需要找到一种方法,使数据处理在创建表单的线程以外的线程上发生。

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

    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)的好处是,它旨在与控件配合使用。

答案 2 :(得分:0)

如果您的问题是冻结的主要形式,您需要的是在分离的线程上收集数据,而不是主窗体正在运行。

为此,您可以这样做:

    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;
    }