- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我通过例如下载文件5 个线程。当其中一个线程完成下载文件部分时 - 它被中止,但所有其余线程都有 ThreadState = WaitSleepJoin 并且显然停止下载。如何解决?
while ((bytesSize = responseStream.Read(Buffer, 0, Buffer.Length)) > 0)
{
lock(fileStream)
{
fileStream.Write(Buffer, 0, bytesSize);
if (DownloadedBytesCount >= EndPosition - StartPosition)
{
downThread.Abort();
break;
}
else DownloadedBytesCount += bytesSize;
}
}
我想 fileStream 在 downThread.Abort() 之后仍然被阻塞。我以为中断会解锁文件流,但事实并非如此。那么如何解锁该文件呢?
这里有更多信息:
我有一个类“ThreadFileManager”:
public class ThreadFileManager
{
public ThreadContent[] threads;
protected static FileStream fileStream { get; set; }
public ThreadFileManager(string fileUrl, string LocalPath, int ThreadCount, int bufferLength, ProgressBar progressBarReference)
{
if (File.Exists(LocalPath))
fileStream = new FileStream(LocalPath, FileMode.Append, FileAccess.Write);
else fileStream = new FileStream(LocalPath, FileMode.Create, FileAccess.Write);
CreateThreads(fileUrl, ThreadCount, bufferLength); //create threads and start downloading
}
private void CreateThreads(string fileUrl, int ThreadCount, int bufferLength)
{
webRequest = (HttpWebRequest)WebRequest.Create(fileUrl);
webRequest.Credentials = CredentialCache.DefaultCredentials;
webResponse = (HttpWebResponse)webRequest.GetResponse();
responseStream = webResponse.GetResponseStream();
//calculate the total bytes count to download per one thread
long part = webResponse.ContentLength / ThreadCount;
fileLength = webResponse.ContentLength;
this.threads = new ThreadContent[ThreadCount];
ThreadContent thr_cn = new ThreadContent(bufferLength, fileUrl);
thr_cn.StartPosition = 0;
thr_cn.EndPosition = part;
threads[0] = thr_cn;
for (int i = 1; i < ThreadCount; i++)
{
thr_cn = new ThreadContent(bufferLength, fileUrl);
thr_cn.StartPosition = (i * part) + 1;
thr_cn.EndPosition = (i + 1) * part;
this.threads[i] = thr_cn;
}
}
}
public class ThreadContent : ThreadFileManager
{
public long StartPosition { get; set; } //the Begining position of the downloading file
public long EndPosition { get; set; } //the End position of the downloading file
public byte[] Buffer { get; set; }
HttpWebRequest webRequest { get; set; }
HttpWebResponse webResponse { get; set; }
long BufferLength { get; set; }
long DownloadedBytesCount { get; set; }
Thread downThread;
string FileURL { get; set; }
public ThreadContent(int bufferLength, string url)
{
Buffer = new byte[bufferLength];
downThread = new Thread(new ThreadStart(Download));
FileURL = url;
}
public void Download()
{
int bytesSize = 0;
webRequest = (HttpWebRequest)WebRequest.Create(FileURL);
webRequest.Credentials = CredentialCache.DefaultCredentials;
webResponse = (HttpWebResponse)webRequest.GetResponse();
responseStream = webResponse.GetResponseStream();
webRequest.AddRange(StartPosition, EndPosition);
while ((bytesSize = responseStream.Read(Buffer, 0, Buffer.Length)) > 0)
{
lock (fileStream)
{
fileStream.Write(Buffer, 0, bytesSize);
base.UpdateProgress(bytesSize);
}
if (DownloadedBytesCount >= EndPosition - StartPosition)
{
downThread.Abort();
break;
}
else DownloadedBytesCount += bytesSize;
}
}
最佳答案
一般来说,您的方法是不正确的,因为您不应该通过调用 Abort() 来结束您的线程。这最终会引发异常。我尝试的方法是只允许线程返回而不是中止。您可以通过传递关于何时返回的线程信息来做到这一点。另一种方法(可能更好)是使用 AutoResetEvent,并在您希望每个线程结束时使用 Set()。线程内部的代码应该是这样的:
AutoResetEvent e = new AutoResetEvent( false);
while( !e.WaitOne( 0)) {
// your code here
}
您似乎希望这 5 个线程共享有关下载状态的信息,即每个线程已下载了多少字节。如果你想要实时更新(我假设),你可以将对计数的引用传递给每个线程,并确保每个线程使用锁来保护对该变量的访问。或者你可以让它每 1K 或更多更新一次字节数,这样你就不会锁定和解锁一堆。
如果你有一个管理这些多个下载线程的工作线程,那么你可以启动每个线程,然后从“主”工作线程(即不是主线程本身,否则你的 GUI 将阻塞)使用 EndInvoke 来确保每个线程已经正常结束。或者您可以使用 AsyncCallback,它会在每个线程完成时被调用。在 AsyncCallback 中,您可以调用 EndInvoke。
关于c# - 当其中一个下载线程终止时解锁 FIleStream,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3645955/
我注意到,当我打开我的应用程序并等待足够长的时间让我的手机自行锁定时,当我解锁它时,当前内容 View 未处于全屏模式。它不显示顶部栏,而是全黑线...如果我去另一个 Activity 并返回它再次修
我必须处理设计限制(依赖性问题)以不对互斥体使用范围保护。 示例代码: template class Test { MutexType myMutex; public: void f(
我正在尝试像这样使 my_class 线程安全。 class my_class { const std::vector& get_data() const { //lock so that
我想让手机在手机被锁定(锁定 = 键盘被锁定)并且用户想要解锁时询问一个问题(来自数据库)。如果答案正确,则手机解锁,否则手机会询问另一个问题。 我不知道如何检测解锁并在需要时解锁/锁定手机。 请帮帮
我有一个对 accept() 的阻塞调用。我从另一个线程关闭套接字,希望它能解除对 accept() 调用的阻塞,它确实如此,但我有一个情况,它没有:例如线程A进入accept(),线程B关闭sock
我在 C# 中有一个可以从多个线程调用多次的函数,我希望它只执行一次,所以我想到了这个: class MyClass { bool done = false; public void
锁定数据库的一个表 复制代码 代码如下: SELECT * FROM table WITH (HOLDLOCK) 注意: 锁定数据库的一个表的区别
我已经使用腻子在我的 ec2 实例上安装了 jenkins,从我的 Windows 系统 当我尝试通过网络访问 jenkins 时,我使用/var/lib/jenkins/secrets/initia
每次我打开我的电脑并尝试连接到 HR 数据库时,都会弹出一个错误提示被阻止,然后我转到 SQLPLUS 并以 SYSDBA 身份登录,并执行以下脚本: 我的问题是,我是否总是必须这样做?有什么办法让它
所以我的手机在引导加载程序中,我想解锁它 所以我输入 fastboot oem unlock 我明白了 D:\Minimal ADB and Fastboot>fastboot oem unlock
在我的应用程序中,我希望即使在应用程序终止后我的应用程序仍处于事件状态。我希望当“滑动解锁”我的应用程序启动时。 有可能吗?我怎样才能在不越狱的情况下做到这一点...... 这是为用户提供便利的功能。
即使我的 iPhone 使用电缆连接并解锁,它也会显示警告“Xcode 9.3 无法在 iPhone 上启动应用程序,因为设备已锁定”。我不知道该怎么办?有人对此有适当的解决方案吗?请 最佳答案 只需
我看到一个非常奇怪的行为,我试图了解它是否是这样设计的,或者只是没有从我的应用程序中正确处理。 我的应用程序以 UIAlertViews 的形式发送推送通知。当设备未锁定时,UIAlertViews
该文档说,从一个线程进行锁定并从另一个rwlock进行解锁会导致未定义的行为。我有一个数组和两个线程,一个分配它,一个释放它,这是一个周期发生的,也有一些线程在其中进行读/写操作,但是它们从不重叠,因
解锁 Oracle 表有哪些不同的技术? 我尝试过的。 获取锁定表的对象ID: SELECT object_id FROM dba_objects WHERE object_name='YOUR TA
我运行@apxchpwd.sql并用这个脚本给帐户倒霉 alter session set current_schema = APEX_050100; declare l_workspace_id
我想在 Chrome 扩展程序中提供一些高级功能。这个想法是,只要用户通过 PayPal 捐赠了一定金额,就可以使用后者的附加功能。 目前我的策略是这样的: 1/。用户填写 PayPal 表格。 2/
我构建了一个包含 IAP(应用内购买)的应用。该应用程序是使用 UINavigationController 构建的。当用户决定购买内容时,解锁功能会解锁该内容。然后,用户点击后退按钮,他们将返回主菜
我有一个只能通过静态方法从外部访问的类。然后,这些静态方法创建该类的一个对象以在该方法中使用,然后它们返回并且该对象可能被销毁。该类是几个配置文件的 getter/setter,现在我需要在对配置文件
我可以在超出 scoped_lock 范围之前解锁互斥锁吗?我怎么能那样做? {boost::mutex::scoped_lock lock(mutex); if(conditionaA) {
我是一名优秀的程序员,十分优秀!