写了一个小程序,它循环遍历远程ftp服务器上的文件夹,列出文件和文件夹。
当程序遇到具有大量文件和文件夹的ftp服务器时,程序冻结(程序的窗口标题栏显示,"进度停止工作")。 如果程序仍然有效,我可以在console.writeline上看到它,显示当前文件夹。
列出所有文件和文件夹后,程序将继续以正常方式工作。 我想我需要将执行recrusive列表的类派生到另一个进程/线程,以保持程序本身以正常方式工作。
任何人都可以给我一个提示如何做这样的事情吗?
答案 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 });
}
}