相关疑难解决方法(0)

调试和发布版本之间的性能差异

我必须承认,通常我没有在程序中调试DebugRelease配置之间进行切换,我通常选择调试配置,即使程序实际部署在客户端也是如此.

据我所知,如果不手动更改这些配置,这些配置之间的唯一区别是DebugDEBUG定义常量,并且Release已检查Optimize代码.

所以我的问题实际上是双重的:

  1. 这两种配置之间是否存在很多性能差异.是否有任何特定类型的代码会在这里造成性能上的巨大差异,或者它实际上并不那么重要?

  2. 是否有任何类型的代码可以在Debug配置下正常运行,可能在Release配置下失败,或者您可以确定在Debug配置下经过测试和正常工作的代码在Release配置下也能正常工作.

.net c# debugging performance configuration

273
推荐指数
7
解决办法
6万
查看次数

Parallel.Invoke不等待异步方法完成

我有一个应用程序从不同的来源提取相当数量的数据.本地数据库,联网数据库和Web查询.任何这些都可能需要几秒钟才能完成.所以,首先我决定并行运行这些:

Parallel.Invoke(
   () => dataX = loadX(),
   () => dataY = loadY(),
   () => dataZ = loadZ()
);
Run Code Online (Sandbox Code Playgroud)

正如预期的那样,所有三个并行执行,但是在最后一个块完成之前,整个块上的执行都不会返回.

接下来,我决定在应用程序中添加一个微调器或"忙指示器".我不想阻止UI线程或者微调器不会旋转.所以这些需要以async模式运行.但是如果我在异步模式下运行所有​​这三个,那么它们的影响就会"同步"发生,而不是与UI在同一个线程中.我仍然希望他们并行运行.

spinner.IsBusy = true;

Parallel.Invoke(
     async () => dataX = await Task.Run(() => { return loadX(); }),
     async () => dataY = await Task.Run(() => { return loadY(); }),
     async () => dataZ = await Task.Run(() => { return loadZ(); })
);

spinner.isBusy = false;
Run Code Online (Sandbox Code Playgroud)

现在,Parallel.Invoke不会等待方法完成,并且微调器立即关闭.更糟糕的是,dataX/Y/Z为空,稍后会发生异常.

这里有什么正确的方法?我应该使用BackgroundWorker吗?我希望能够利用.Net 4.5的功能.

.net c# task-parallel-library async-await

20
推荐指数
2
解决办法
1万
查看次数