开始:
thread = new Thread(new ThreadStart(Start));
thread.Priority = ThreadPriority.Highest;
thread.Start();函数:
public void Start()
{ Cursor currentCursor = this.Cursor;
//FtpWebResponse response = null;//Ftp服务器的回应(便是FTP返回的数据)
try
{ FtpWebRequest request = WebRequest.Create(label1.Text + text_Server.Text) as FtpWebRequest;//FTP服务器
request.Credentials = new NetworkCredential(text_Username.Text, text_Password.Text);//FTP身份验证 request.Method = WebRequestMethods.Ftp.ListDirectory;//索取列表文件夹的命令 //response = (FtpWebResponse);//获取服务端响应的数据
FillDirectoryList(request.GetResponse().GetResponseStream());//获取数据流,并传至、填充数据
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Error FTP Client");
}
finally
{
//response.Close();
if (thread != null)
{
thread.Abort();
thread.Join();
}
}
}红色区域 request.GetResponse().GetResponseStream() 一直无响应……可是不用线程,却可以执行。郁闷老·
thread = new Thread(new ThreadStart(Start));
thread.Priority = ThreadPriority.Highest;
thread.Start();函数:
public void Start()
{ Cursor currentCursor = this.Cursor;
//FtpWebResponse response = null;//Ftp服务器的回应(便是FTP返回的数据)
try
{ FtpWebRequest request = WebRequest.Create(label1.Text + text_Server.Text) as FtpWebRequest;//FTP服务器
request.Credentials = new NetworkCredential(text_Username.Text, text_Password.Text);//FTP身份验证 request.Method = WebRequestMethods.Ftp.ListDirectory;//索取列表文件夹的命令 //response = (FtpWebResponse);//获取服务端响应的数据
FillDirectoryList(request.GetResponse().GetResponseStream());//获取数据流,并传至、填充数据
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Error FTP Client");
}
finally
{
//response.Close();
if (thread != null)
{
thread.Abort();
thread.Join();
}
}
}红色区域 request.GetResponse().GetResponseStream() 一直无响应……可是不用线程,却可以执行。郁闷老·
FillDirectoryList(request.GetResponse().GetResponseStream());
我测试过,这里除了问题,红色部分。
{
//response.Close();
if (thread != null)
{
thread.Abort();
thread.Join();
}
}
{
StreamReader reader = new StreamReader(stream);
string content = reader.ReadToEnd();
list_Files.DataSource = content.Split('\n');//读取数据
reader.Close();
}这代码也会错误?!
{
StreamReader reader = new StreamReader(stream);
string content = reader.ReadToEnd();
list_Files.DataSource = content.Split('\n');//读取数据
reader.Close();
}FillDirectoryList(request.GetResponse().GetResponseStream());
问题似乎是出在这里。
这样用试试
http://msdn.microsoft.com/zh-cn/library/3s8xdz5c.aspx
finally
{
//response.Close();
if (thread != null)
{
thread.Abort();
thread.Join();
}
}
不需要thread.Abort();
thread.Join();
abort并不能终止线程,如果线程阻塞将在thread.Join();的时候一直等待直到天荒地老
原因出在哪里呢?这个是不是BUG?问题出在FillDirectoryList的ListBox,当DataSource属性发生错误的时候,便复制为=null。可是这个错误,是“线程间操作无效: 从不是创建控件“*”的线程访问它。”网上关于此错误的说法随处可见,可是隐藏之深的错误竟然没有报告出来。汗死!正确代码。 Thread t = null;
private void OnOpen(object sender, EventArgs e)
{
//FtpClient fc = new FtpClient(label1.Text + text_Server.Text, text_Username.Text, text_Password.Text);
//FillDirectoryList(fc.GetDirectoryList());
ThreadStart ts = delegate()
{
GoConnect gc = new GoConnect(Start);
stBox1.Invoke(gc);//在此控件上执行执行线程
};
t = new Thread(ts);
t.Start();
}
delegate void GoConnect();
public void Start()
{
Cursor currentCursor = this.Cursor;
FtpWebResponse response = null;//Ftp服务器的回应对象(便是FTP返回的数据)
//try
//{
FtpWebRequest request = WebRequest.Create(label1.Text + text_Server.Text) as FtpWebRequest;//FTP服务器
request.Credentials = new NetworkCredential(text_Username.Text, text_Password.Text);//FTP身份验证 request.Method = WebRequestMethods.Ftp.ListDirectory;//索取列表文件夹的命令
response = (FtpWebResponse)request.GetResponse();//获取服务端响应的数据
FillDirectoryList(response.GetResponseStream());//获取数据流,并传至、填充数据