线程,进度条howto

时间:2011-12-02 10:52:20

标签: c# multithreading progress-bar

我使用XslCompiledTransform将XML文件转换为HTML。 XML文件不是那么短,所以转换浪费了很多时间。

我的代码:

 xslTransform.Transform(fi.FullName, TMP_TRANSFORMED_XML_PATH);
 webBrowser1.Navigate(TMP_TRANSFORMED_XML_PATH);

所以我想使用未绑定到表单的进度条或(更好)进度图标(对话框?)。

问题在于我有两种形式。 第一个项目有一个项目列表和一个按钮,当选择项目并按下按钮时,显示第二个表格(非模态),XML文件转换,并在WebBrowser控件中显示。

在第二种形式构造函数中,我调用XslCompiledTransform.Load,初始化控件,然后调用XslCompiledTransform.Transform()

在第二种形式中,我还有按钮在第一个表单列表项之间导航。所以,当我按下'>'然后选择第一种形式的下一个元素,重新加载第二种形式的元素 - 例如更改了一些文本,并再次为新的XML文件调用XslCompiledTransform.Transform()。

那么,每次加载第二张表格时如何组织进度条?

从第一表格:

private void OpenSecondForm()
{
    if (formTwo == null)
    {
            formTwo = new FormTwo(this, culture, params);
            formTwo .Show();
    }
    else
    {
            if (formTwo .IsDisposed)
            {
                formTwo = new FormTwo(this, culture, params);
                formTwo .Show();
            }
            else
            {
                formTwo .Reinitialaze(culture, invoice);
            }
            formTwo .BringToFront();
    }

}

public void SelectRow(int moveTo)
{
    try
    {
      /*navigate on list here */
  /* ... */

OpenSecondForm();
    }
    catch (Exception e)
    { MessageBox.Show(e.Message, "ERROR"); }
}

第二种形式:

public FormTwo(Form parent, CultureInfo cultr, string params)
{
    culture = cultr;

    parentForm = parent;
    rm = new ResourceManager("MyProject.Resource", typeof(FormOne).Assembly);
    InitializeComponent();

    xslTransform = new XslCompiledTransform();
    xslTransform.Load(XSL_TRANSFORM_SCHEMA_NAME);

    ReInitialazeAll();

}

internal void Reinitialaze(CultureInfo cultr, string params)
{
    culture = cultr;

    ReInitialazeAll();
}

private void ReInitialazeAll()
{
    SelectDatabaseData();

    InitCaptions();
    InitForms();

}

private void InitForms()
{
    EnableDisableButtons();
    webBrowser1.DocumentText = "<HTML><BODY></BODY></HTML>";

    FillXmlData();
}

private void FillXmlData()
{
    xslTransform.Transform(fi.FullName, TMP_TRANSFORMED_XML_PATH);
    webBrowser1.Navigate(TMP_TRANSFORMED_XML_PATH);
}

我试图创建一个线程来执行这些FillXmlData。但是当xml正在转换时,我的表单仍无法访问。

1 个答案:

答案 0 :(得分:1)

您需要在单独的线程上运行XML转换(以及任何其他冗长的非UI加载操作)。像这样:

public FormTwo(Form parent, CultureInfo cultr, string params)
{
    culture = cultr;

    parentForm = parent;
    rm = new ResourceManager("MyProject.Resource", typeof(FormOne).Assembly);

    InitializeComponent();

    // Show the progress bar
    this.ProgressBar.Visible = true;

    // Load on another thread
    Thread loadingThread = new Thread(new ThreadStart(TransformXml));
    loadingThread.Start();
}

private void TransformXml()
{
    xslTransform = new XslCompiledTransform();
    xslTransform.Load(XSL_TRANSFORM_SCHEMA_NAME);

    ReInitialazeAll();
}

注意:这假定您的进度条名为ProgressBar

但是,您需要注意,您无法访问另一个线程上的UI元素,因此需要在UI线程上调用ReInitialazeAll()(包含拼写错误)。这可以通过以下方式安全地完成:

private void ReInitialazeAll()
{
    // Make sure we're running on the UI thread
    if (this.InvokeRequired)
    {
        BeginInvoke(new Action(ReInitialazeAll));

        return;
    }

    // Hide the progress bar
    this.ProgressBar.Visible = false;

    // ... execute UI-related code
}

这应该给你一个足够好的开始,你可以工作。