c#不支持一个STA线程上针对多个句柄的WaitAll

qq_35169207 2017-05-03 05:15:45
代码如下,在 WaitHandle.WaitAll(doneEvents);时报错。用的是WPF写的项目,整个解决方案中国找不到用STAThread修饰的地方。大神还请指教
  public bool DoDownLoad(List<DownloadFile> downloadFiles)
{

try
{
//cpu核心数为线程数
int processorCount = Environment.ProcessorCount>=5? Environment.ProcessorCount:5;
ManualResetEvent[] startEvents = new ManualResetEvent[processorCount];
ManualResetEvent[] doneEvents = new ManualResetEvent[processorCount];
ThreadParam[] Params = new ThreadParam[processorCount];
Thread[] threads = new Thread[processorCount];
for (int i = 0; i < processorCount; ++i)
{
startEvents[i] = new ManualResetEvent(false);
doneEvents[i] = new ManualResetEvent(false);
Params[i] = new ThreadParam
{
MId = i, //线程ID
MStartEvent = startEvents[i], //启动下载事件
MDoneEvent = doneEvents[i] //完成下载事件
};
threads[i] = new Thread(new ParameterizedThreadStart(AsyncDownloadFile));
threads[i].Start(Params[i]);
}

//始终只有Environment.ProcessorCount多个线程在下载一个文件,你可以根据实际情况修改
for (int i = 0; i < downloadFiles.Count; ++i)
{
DownloadFile f = downloadFiles[i];

//分配线程下载任务
CutFile(Params, f.MFileSize);

for (int j = 0; j < processorCount; ++j)
{
Params[j].MUrl = f.MUrl;//文件下载地址
Params[j].MFileName = f.MFileName;//文件名称
Params[j].MDoneEvent.Reset(); //清空下载完成
Params[j].MStartEvent.Set(); //启动线程
}
//等待下载中...
WaitHandle.WaitAll(doneEvents);

//将临时文件合并为完整文件
MergeFile(Params);
}
return true;
}
catch (Exception err)
{
return false;
}
...全文
616 2 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
xuggzu 2017-05-04
  • 打赏
  • 举报
回复
wpf不允许修改sta,楼主可以建个线程再去调用wait。
  • 打赏
  • 举报
回复
在WPF 项目中的App.g.i.cs 中: [System.STAThreadAttribute()]

 /// <summary>
        /// Application Entry Point.
        /// </summary>
        [System.STAThreadAttribute()]
        [System.Diagnostics.DebuggerNonUserCodeAttribute()]
        [System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "4.0.0.0")]
        public static void Main() {
            WpfApplication1.App app = new WpfApplication1.App();
            app.InitializeComponent();
            app.Run();
        }

111,092

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧