使用Thread非常简单
Thread thread = new Thread(MethodWhichRequiresSTA);
thread.SetApartmentState(ApartmentState.STA);
Run Code Online (Sandbox Code Playgroud)
如何使用WPF应用程序中的任务完成相同的操作?这是一些代码:
Task.Factory.StartNew
(
() =>
{return "some Text";}
)
.ContinueWith(r => AddControlsToGrid(r.Result));
Run Code Online (Sandbox Code Playgroud)
我收到了一个InvalidOperationException
调用线程必须是STA,因为许多UI组件都需要这个.
你好吗 我正在组建一个新的软件团队,我正在寻找不同的工具来克服我之前与其他团队一起做过的噩梦.
在过去的5 - 6年中,这些是我经历过的一些转变:
SourceControl:
CVS => VSS => SVN
项目管理,错误和问题跟踪:
论文=> PostIt Notes => OneNote => BugNet => OnTime
维基和文档:
Word +网络共享=> ScrewTurn Wiki
Builder Automation:
Cruise Control + MSBuild
现在,特别是因为SVN和Wiki的情况,我正在考虑以新鲜的方式开始这个团队.在过去,我们有SVN的分支噩梦,我们越努力修复它,它就变得越糟糕.我面临的另一个挑战是寻找稳定和整合的东西.你可以想象BugNet + SVN + ScrewTurn + CruiseControl + MSBuild是完全不同的动物,所以整合和协同作用非常重要; 我不想在10个不同的应用程序之间跳转来报告错误或分配任务并查看已完成的工作并查看repo日志.
所以,新团队和我现在已经讨论了几天了,我认为我们已经把它缩小到2个可能性:
1.TFS 2010
优点:
- 一体化解决方案.它真正拥有一切,包括一个新的SCRUM流程模板.
- 非常友好的用户界面和SharePoint集成.
- WYSIWYG Wiki和Office集成.
缺点:
- 硬件和管理时间的前期成本较高.软件也是如此,但它不会影响我们,因为我们有免费软件的MSDN订阅.
- 我对TFS的源代码控制犹豫不决.SC是基于文件的,具有中央存储库,就像SVN和VSS一样.我真的不想因为我们过去遇到的同样问题而陷入困境.
2. FugBUgs + Kiln + CC
优点:
- Kiln使用Mercurial,具有分布式源代码控制的所有优点.
- 最低的前期成本和计划时间来启动和运行.每位用户每月$ 30.00.
- 非常友好的Web用户界面.
- WYSIWYG Wiki编辑器.
- 非常简单的问题跟踪器和项目管理工具.集成SCRUM流程很容易.
缺点:
- …
调试我的Win32应用程序时,窗口和对话框有时(很少)不会出现在所选的Windows方案中,而是减少或损坏:
窗口标题全部为黑色(而不是蓝色或银色),没有任何阴影.按钮没有任何按钮形状(屏幕截图中的"Abbrechen").下半部分的黑条是一个窗口进度条.发生这种情况时,它不会显示任何进展.
屏幕截图(中心的灰色细节)取自在XP SP3 x64和10 GB机器上的Visual Studio 2010下调试的64位应用程序.有足够的RAM(一些GB)备用.
有没有人知道原因?我从不做非客户区绘图或其他什么.
编辑:仅当Visual Studio调试程序已附加到该程序时,才会出现此症状.但即使应用程序已从调试器中分离出来,问题仍然存在.在没有调试的情况下启动程序时不会发生.
我的问题是我显然使用了太多的任务(线程?)来调用查询SQL Server 2008数据库的方法.这是代码:
for(int i = 0; i < 100000 ; i++)
{
Task.Factory.StartNew(() => MethodThatQueriesDataBase()).ContinueWith(t=>OtherMethod(t));
}
Run Code Online (Sandbox Code Playgroud)
过了一会儿,我得到一个SQL超时异常.我希望将实际线程数保持低于(100)低于100000的缓冲区,称为"一次不超过10".我知道我可以使用ThreadPool管理我自己的线程,但我希望能够使用ContinueWith来使用TPL之美.
我看着Task.Factory.Scheduler.MaximumConcurrencyLevel
它,但它没有二传手.
我怎么做?
提前致谢!
更新1
我刚刚测试了LimitedConcurrencyLevelTaskScheduler
类(由Skeet指出)并且仍在做同样的事情(SQL超时).
顺便说一句,这个数据库每天接收超过800000个事件,并且从未发生过崩溃或超时.这听起来有点奇怪.