thread.abort()NetworkStream.Readで起動しましたか?
-
10-12-2019 - |
質問
ファイル転送アプリケーション(サーバクライアント)...ファイルを送信しながら、キャンセルを有効にしたい。
クライアントキャンセルBackgroundWorkerによって機能するSendFileメソッドをキャンセルしてから、受信スレッドをキャンセルするためにサーバーにコマンドを送信します。
サーバーがこのコマンドを受信すると、停止方法を呼び出しますが、その行 Network.Read(Data、0、Data.Length)に貼り付けます。
このスレッドを中止し、Network.Read(..)で絞り込むことなく に進むことができますか?
事前にありがとうございます。
.Thread thTransferFile = null;
void Start()
{
thTransferFile = new Thread(unused => ft.Receive(destPath, Convert.ToInt64(fileSize);
thTransferFile.Start();
}
void Stop()
{
thTransferFile.Abort();
}
public void Receive(string destPath, long fileSize)
{
using (fs = new FileStream(destPath, FileMode.Create, FileAccess.Write))
{
try
{
int count = 0;
long sum = 0;
data = new byte[packetSize];
while (sum < fileSize)
{
count = network.Read(data, 0, data.Length); //thread stucks in this line when i abort it
fs.Write(data, 0, count);
sum += count;
}
}
finally
{
network.Write(new byte[1], 0, 1); //tell client that the file transfer ends
network.Flush();
fs.Dispose();
if (Thread.CurrentThread.ThreadState == ThreadState.AbortRequested)
{
File.Delete(destPath);
}
}
}
解決 3
i've found a solution when i cancel sending from client side .. the network.DataAvailable set to false .. so i added this line to my receive method in the server
in the while loop:
while (sum < fileSize)
{
if (network.DataAvailable)
{
count = network.Read(data, 0, data.Length);
fs.Write(data, 0, count);
sum += count;
}
}
so it will never stuck at network.Read anymore. it totally worked
他のヒント
Instead of aborting the thread, Close()
the network
. It will throw the exception like you are expecting.
Killing threads is a big no-no, since there are resources that can be left uncleaned...
NetworkStream.Read is blocked until it receives data. Set a timeout on the read operation by using NetworkStream's ReadTimeout
Read the community comment. Also, you may want to reconsider using Abort() to kill your thread. Add a boolean flag in your while loop, and set that flag to false when Stop() is called. This stop flag, combined with a ReadTimeout
will ensure that your program eventually exits.
The thread that calls Abort might block if the thread that is being aborted is in a protected region of code, such as a catch block, finally block, or constrained execution region. If the thread that calls Abort holds a lock that the aborted thread requires, a deadlock can occur.