为某个类创建其他线程/进程

时间:2014-12-24 19:55:48

标签: c#

写了一个小程序,它循环遍历远程ftp服务器上的文件夹,列出文件和文件夹。

当程序遇到具有大量文件和文件夹的ftp​​服务器时,程序冻结(程序的窗口标题栏显示,"进度停止工作")。 如果程序仍然有效,我可以在console.writeline上看到它,显示当前文件夹。

列出所有文件和文件夹后,程序将继续以正常方式工作。 我想我需要将执行recrusive列表的类派生到另一个进程/线程,以保持程序本身以正常方式工作。

任何人都可以给我一个提示如何做这样的事情吗?

1 个答案:

答案 0 :(得分:0)

您的应用程序看起来像被绞死,因为您的主要线程正在执行扫描操作而不是管理用户界面(UI)。

你必须在单独的线程中进行扫描。这是另一个问题。您无法直接从其他线程更新UI。 How to update the GUI from another thread in C#?

修改

protected void ButtonScan_Click(...)
{
    ButtonScan.IsEnabled = false;
    string folderName = "Root";
    Thread t = new Thead(ScanFolder);
    t.Start(folderName);
}

private void ScanFolder(object argument)
{
    string folderName = (string)argument;
    int filesCount = // do scanning
    SetControlPropertyThreadSafe(myLabel, "Text", filesCount.ToString());
    ButtonScan.IsEnabled = true;
}

private delegate void SetControlPropertyThreadSafeDelegate(Control control, string propertyName, object propertyValue);

public static void SetControlPropertyThreadSafe(Control control, string propertyName, object propertyValue)
{
  if (control.InvokeRequired)
  {
    control.Invoke(new SetControlPropertyThreadSafeDelegate(SetControlPropertyThreadSafe), new object[] { control, propertyName, propertyValue });
  }
  else
  {
    control.GetType().InvokeMember(propertyName, BindingFlags.SetProperty, null, control, new object[] { propertyValue });
  }
}