سؤال

لدي تطبيق نقل الملفات (خادم العميل) ... أثناء إرسال ملف، أريد تمكين الإلغاء.
عميل إلغاء طريقة SendFile التي تعمل عن طريق BropressWorker ثم ترسل الأمر إلى الخادم لإلغاء مؤشر ترابط الاستقبال.
عندما يتلقى الخادم هذا الأمر، فإنه يدعو إلى Stop الأسلوب لكنه يتعاقد في هذا الخط network.Read (البيانات، 0، data.length)؛

كيف يمكنني إحباط هذا الموضوع والذهاب إلى أخيرا بدون عالقة في Network.Read (..)؟ شكرا مقدما. giveacodicetagpre.

هل كانت مفيدة؟

المحلول 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 ReadTimeoutRead 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.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top