线程,进度条如何

本文关键字:线程 | 更新日期: 2023-09-27 18:16:47

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

我代码:

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

所以我想使用进度条或(更好的)进度图标(对话框?),而不是绑定到一个窗体。

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

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

在第二个表单中,我也有按钮在第一个表单列表项之间导航。因此,当我按下'>',然后从第一个形式的下一个元素被选中,和第二个形式的元素被重新加载-例如,一些文本改变和XslCompiledTransform.Transform()被再次调用一个新的XML文件。

那么,如何组织进度条,而第二形式是每次加载?

From 1st Form:

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转换时,我的表单仍然无法访问

线程,进度条如何

您需要在单独的线程上运行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
}

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