与上面的RulyCanceler类的代码相比,我想使用运行代码 CancellationTokenSource.
如何在取消令牌中提到它,即不抛出/捕获异常?我可以使用该IsCancellationRequested物业吗?
我试图像这样使用它:
cancelToken.ThrowIfCancellationRequested();
Run Code Online (Sandbox Code Playgroud)
和
try
{
new Thread(() => Work(cancelSource.Token)).Start();
}
catch (OperationCanceledException)
{
Console.WriteLine("Canceled!");
}
Run Code Online (Sandbox Code Playgroud)
但这cancelToken.ThrowIfCancellationRequested();在方法中给出了运行时错误Work(CancellationToken cancelToken):
System.OperationCanceledException was unhandled
Message=The operation was canceled.
Source=mscorlib
StackTrace:
at System.Threading.CancellationToken.ThrowIfCancellationRequested()
at _7CancellationTokens.Token.Work(CancellationToken cancelToken) in C:\xxx\Token.cs:line 33
at _7CancellationTokens.Token.<>c__DisplayClass1.<Main>b__0() in C:\xxx\Token.cs:line 22
at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
at System.Threading.ThreadHelper.ThreadStart()
InnerException:
Run Code Online (Sandbox Code Playgroud)
我成功运行的代码在新线程中捕获了OperationCanceledException:
using System;
using System.Threading; …Run Code Online (Sandbox Code Playgroud) 我正在编写一个应用程序,我需要从数据库中检索一些行并将它们转储到Excel电子表格中.我正在使用Linq来检索这些行.
是否可以将这些行直接转储到Excel工作表中的对应部分(其中Excel中的一个单元格对应于数据库中的一个单元格)?
我有一个C#/ .NET 4.0应用程序,当我启动时显示两个窗口,其中包含大约十几个控件.当我运行我的程序(调试或发布无关紧要)时,在我甚至做任何事情之前,我在任务管理器/资源监视器中看到我的程序已经有超过450MB的私有内存.我意识到任务管理器不是测量内存使用率最可靠的方法,但它是我用户最明显的方法之一.
当我运行VS2010 .NET内存分配性能分析时,对于我的程序的完整运行,它报告实际分配给托管对象的大约5MB的RAM(我的程序通常也使用一些非托管对象,但它们非常小并且对于简化这项调查我已禁用它们,但没有显着效果).同样,如果我在显示主表单后从psapi.dll调用EmptyWorkingSet(),我的私有内存将降至~3.5 MB.
我已经在这里和这里查看了有关内存占用的问题,但这些问题似乎与处理几十兆字节的程序有关.我的程序显示近500MB,看起来更令人担忧.
我无法想象所有这一切都来自开销; 为什么VS Profiler和任务管理器之间存在如此巨大的差异?
更新:有趣的是,如果我注释掉设置ImageLists的InitializeComponent()部分,任务管理器中的数字将保持在10MB以下.我有两套PictureBoxes和ImageLists,其中PictureBox显示四个图像中的一个,具体取决于选中单选按钮组中的哪个单选按钮.
这些代码行似乎会触发大量内存增加:
//
// directionImageList
//
this.directionImageList.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject("directionImageList.ImageStream")));
this.directionImageList.TransparentColor = System.Drawing.Color.White;
this.directionImageList.Images.SetKeyName(0, "Dir1.png");
this.directionImageList.Images.SetKeyName(1, "Dir2.png");
this.directionImageList.Images.SetKeyName(2, "Dir3.png");
this.directionImageList.Images.SetKeyName(3, "Dir4.png");
//
// modeImageList
//
this.modeImageList.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject("modeImageList.ImageStream")));
this.modeImageList.TransparentColor = System.Drawing.Color.White;
this.modeImageList.Images.SetKeyName(0, "Mode1.png");
this.modeImageList.Images.SetKeyName(1, "Mode2.png");
this.modeImageList.Images.SetKeyName(2, "Mode3.png");
Run Code Online (Sandbox Code Playgroud)
我正在使用ImageLists,所以我可以使用透明度.模式图像为100x100,每个占用<26KB的磁盘空间.方向图像默认为208x277,磁盘大约为75KB.我知道png是一种压缩格式,但即使在内存中未压缩,我也不会期望这七张图片有数百兆字节.
是否有一些我所知道的低效率,是否有另一种动态显示透明图片的方法?
结论: ImageList类有些东西可疑.有时它会丢失alpha通道,这导致我的程序保留了比它需要的更多内存.它也减慢了最初绘制主窗体的时间(在运行时和在设计器中).
倾倒两个ImageLists使我的程序降低到更健康的10MB RAM.感谢大家的所有建议!
我有一个应用程序,它读取一组数据文件并执行一些模型计算.程序不需要自己修改数据文件,所以我现在用只读标志打开它们,如下所示:
FILE* file;
if(_wfopen_s(&file, fname.c_str(), L"r") == 0)
...
Run Code Online (Sandbox Code Playgroud)
我希望我的程序的几个实例同时运行,使用相同的数据集,但对数据执行不同的计算.我的程序都不需要修改数据文件.由于数据文件非常大,我无法单独复制数据以用于每个程序.
我假设因为我打开具有只读权限的文件,两个程序可能同时从同一个文件中读取.相反,我得到了各种错误,"文件无法打开,因为它正被另一个进程使用".
由于我的开发环境是Windows 7,因此这个问题表明它可能是启用读取共享的问题.但是,该线程中的所有答案都依赖于CreateFile,而我正在处理使用stdio.h编写的遗留代码.
有没有办法可以使用fopen类函数从文件中同时读取多个程序?
我是Python的新手.我想为一些名称检查编写正则表达式.我的输入字符串可以包含az,AZ,0-9和'_',但它应该以az或AZ(不是0-9和'_')开头.我想为此写一个正则表达式.我试过了,但没有什么能完美搭配.
一旦输入字符串遵循正则表达式规则,我就可以继续进行,否则丢弃该字符串.
有没有办法更改High Impact PowerShell脚本的默认确认选项?
当我实现一个Cmdlet并运行它要求确认时
MyPS
Confirm
Are you sure you want to perform this action?
Performing operation "XYZ" on Target "123".
[Y] Yes [A] Yes to All [N] No [L] No to all [S] Suspend [?] Help (default is "Y"):
Run Code Online (Sandbox Code Playgroud)
如何更改默认值?我想将默认值从"Y"更改为"N".
我是正则表达式的新手,想知道如何编写执行以下操作的正则表达式:
验证字符串,如123-0123456789.只允许使用数值和连字符.另外,验证连字符前面有3个数字字符,连字符后面有10个字符.
我制作了一个不透明度为30%的表单,我希望这个可以覆盖在我的屏幕上,这样我就可以在其上绘制一个网格,同时仍然可以控制下面的任何程序.所以我希望我用网格创建的表单忽略我的鼠标事件,所以我可以点击下面的程序但仍然显示在顶部.
关于这个的任何想法?
我拥有一个带有 DateTime 属性的 cmdlet,该属性表示服务器上事件的时间戳。该 cmdlet 读取服务器上的日志并输出一些信息。由于一堆事件可能在短时间内发生,因此毫秒精度对于输出的用户来说非常重要。
但是,当使用 format-list 或 format-table 时,输出仅显示秒,例如4/15/2015 5:31:30 PM。我更喜欢使用fff 时间格式。
我知道实际数据没有四舍五入,因为如果我查询 DateTime 值的 Millisecond 属性,我会看到正确的值。例如,对于给定的输出$event,如果我的日志行具有时间戳2015-04-16T00:31:30.525Z,$event.Timestamp.Millisecond则返回 525。
我可以在 cmdlet 中执行某些操作来指定 DateTime 应以毫秒显示吗?例如,当用户输入:
> Get-LogInfo | ft
Run Code Online (Sandbox Code Playgroud)
我想默认显示:
Timestamp EventData
--------- -------
4/15/2015 17:31:28.525 (data)
Run Code Online (Sandbox Code Playgroud)
我也希望格式列表有类似的行为。理想情况下,cmdlet 用户无需执行任何额外工作即可查看毫秒。
我的语法定义如下:
A -> aA*b | empty_string
Run Code Online (Sandbox Code Playgroud)
是A正则表达式吗?我对如何解释BNF语法感到困惑.