gpt4 book ai didi

c# - 如何在C#中中断服务器连接

转载 作者:太空宇宙 更新时间:2023-11-03 22:27:35 25 4
gpt4 key购买 nike

我的应用程序的一个功能是从我们的 ftp 服务器下载文件。当然,此功能需要取消此操作(取消下载)。

现在,我的下载函数如下:

try
{
reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri("ftp://" + uri + "/" + fileName));
reqFTP.Method = WebRequestMethods.Ftp.DownloadFile;
reqFTP.UseBinary = true;
reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword);
reqFTP.UsePassive = true;

response = (FtpWebResponse)reqFTP.GetResponse();
ftpStream = response.GetResponseStream();
_isItOutputStream = true;
string dataLengthString = response.Headers["Content-Length"];
int dataLength = 0;
if (dataLengthString != null)
{
dataLength = Convert.ToInt32(dataLengthString);
}

long cl = response.ContentLength;
int bufferSize = 4048;
int readCount;
byte[] buffer = new byte[bufferSize];
readCount = ftpStream.Read(buffer, 0, bufferSize);
outputStream = new FileStream(filePath + "\\" + fileName, FileMode.Create);
bool first = true;
while (readCount > 0)
{
outputStream.Write(buffer, 0, readCount);
_actualDownloaded += readCount;
if (this.InvokeRequired)
{
ProgressBarDel _progressDel = new ProgressBarDel(ProgressBar);
this.Invoke(_progressDel, new object[] { _actualDownloaded, first });
}
first = false;
readCount = ftpStream.Read(buffer, 0, bufferSize);
}
ftpStream.Close();
outputStream.Close();
response.Close();
_isItOutputStream = false;
return true;
}
catch (Exception ee)
{
_downloadException = ee.Message;
if (ftpStream != null && outputStream!=null )
if (ftpStream.CanRead && outputStream.CanWrite)
{
ftpStream.Close();
outputStream.Close();
}

if (response != null)
response.Close();

return false;
}

现在,正如您在 Catch block 中看到的那样,您可以看到当用户单击“取消”按钮时我正试图中断此连接。

  • 取消操作场景:

1) 单击取消按钮。

2) 调用函数“DoSomeWorx()”

3) 在“DoSomeWorx()”中做:

if (_isItOutputStream)// where here i'm trying to check if it's downloading 
{
ftpStream.Close();
outputStream.Close();
response.Close();
}
if (_startCopy)// check if copying to phone
{
IsCancelled();
}
_btnDownload2PhoneThread.Abort(); // actually this operation does what i did before but for some resoans it does this but it takes time...
_btnDownload2PhoneThread.Join();

问题是当我达到以下任何状态时 (ftpStream.Close();outputStream.Close();response.Close();)

它抛出异常“文件不可用(例如文件正忙)”

并且此异常会影响它看到文件繁忙时的重新下载操作。

那么如何避免这个异常呢?

最佳答案

我假设您有某种形式,所以您在一个线程上执行下载。

您可能最好做的是在 while 循环中检查“取消”标志。

例如。

while(readcount > 0 && !cancel)
{
...
}

然后让你的方法优雅地抵消掉。

其次,您应该在流上使用 using 语句。这意味着如果你抛出一个异常,finally block 将保证你的流被处理(顺便说一句,这就是为什么你会收到文件忙,因为流还没有运行它的析构函数,即使你的方法已经完成)

关于c# - 如何在C#中中断服务器连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/741520/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com