我遇到了一些我根本不理解的东西.在我的应用程序中,我有几个线程都将项目添加(和删除)到共享集合(使用共享锁).UI线程使用计时器,并在每个tick上使用集合来更新其UI.
既然我们不希望UI线程长时间保持锁定并阻止其他线程,我们这样做的方式是,首先我们获取锁,我们复制集合,然后释放锁,然后在我们的副本上工作.代码如下所示:
public void GUIRefresh()
{
///...
List<Item> tmpList;
lock (Locker)
{
tmpList = SharedList.ToList();
}
// Update the datagrid using the tmp list.
}
Run Code Online (Sandbox Code Playgroud)
虽然它工作正常,但我们注意到应用程序有时会出现速度减慢,当我们设法捕获堆栈跟踪时,我们看到了:
....
at System.Windows.Forms.DataGrid.OnPaint(PaintEventArgs pe)
at MyDataGrid.OnPaint(PaintEventArgs pe)
at System.Windows.Forms.Control.PaintWithErrorHandling(PaintEventArgs e, Int16 layer, Boolean disposeEventArgs)
at System.Windows.Forms.Control.WmPaint(Message& m)
at System.Windows.Forms.Control.WndProc(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
at System.Threading.Monitor.Enter(Object obj)
at MyApplication.GuiRefresh()
at System.Windows.Forms.Timer.OnTick(EventArgs e)
at System.Windows.Forms.Timer.TimerNativeWindow.WndProc(Message& m)
at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr …Run Code Online (Sandbox Code Playgroud) 作为对此的后续问题:TypeScript override ToString()
假设我们有一个Person类,我们toString像这样覆盖:
class Person {
constructor(
public firstName: string,
public lastName: string
) {}
public toString(): string {
return this.firstName + ' ' + this.lastName;
}
}
Run Code Online (Sandbox Code Playgroud)
因此,如原始问题中所述,这在执行console.log("" + myPerson);时工作正常,但是Person在调试器中检查 的实例时toString似乎被忽略并显示默认显示。我针对 Google Chrome 的调试器(悬停在变量上)和 VS Code 的调试器(都悬停在变量上,并查看“本地”选项卡)进行了测试。
有没有办法让一个或两个调试器尊重toString覆盖?
注意:如果我使用 lambda 版本的 toString 没有关系,结果是一样的。
我有一个ac#solution(开源,可以在这里:https://github.com/tzachshabtay/MonoAGS),我可以从Visual Studio 2017(Dot net framework)和VS for Mac(Mono)编译.我也可以在Linux和mac上成功地在Travis CI上用msbuild编译它(https://github.com/tzachshabtay/MonoAGS/blob/master/.travis.yml).
我不能做的是在我的本地机器上从Windows 10在命令行上编译它.我希望能够为DotNet Framework和Mono编译它.所以我尝试从单声道安装和使用MSBuild Build Tools for Visual Studio 2017(注意:我希望能够在Windows上安装,即使没有安装vs2017,虽然安装了本地机器vs2017,但不知道是否重要).这两个安装都是针对今天的最新版本.
这是我在单声道上从msbuild获得的错误(PATH设置为%programfiles(x86)%\Mono\bin):
项目"C:\ Github\MonoAGS\MonoAGS.sln"(1)在节点1(默认目标)上构建"C:\ Github\MonoAGS\Source\Tests\Tests.csproj"(2).项目"C:\ Github\MonoAGS\Source\Tests\Tests.csproj"(2)在节点1上构建"C:\ Github\MonoAGS\Source\AGS.API\AGS.API.csproj"(3)(GetTargetFrameworks目标(一个或多个)).C:\ Program Files\dotnet\sdk\2.1.4\Sdks\Microsoft.NET.Sdk\Sdk\Sdk.props(29,11):错误MSB4226:导入的项目"C:\ Program Files(x86)\ MSBuild\15.0\Microsoft.Common.props"未找到.另外,尝试在$(MSBuildExtensionsPath) - "C:\ Program Files(x86)\ MSBuild"的后备搜索路径中找到"15.0\Microsoft.Common.prop s".这些搜索路径在"C:\ Program Files\Mono\lib\mono\msbuild\15.0\bin\MSBuild.dll.config"中定义.确认声明中的路径是正确的,并且该文件存在于其中一个搜索路径的磁盘上.[C:\ Github上\ MonoAGS \源\ AGS.API\AGS.API.csproj]
这是我从构建工具从msbuild获得的错误(PATH设置为%programfiles(x86)%\Microsoft Visual Studio\2017\BuildTools\MSBuild\15.0\Bin):
项目"C:\ Github\MonoAGS\Source\Tests\Tests.csproj"(2)在节点1上构建"C:\ Github\MonoAGS\Source\AGS.API\AGS.API.csproj"(3)(GetTargetFrameworks目标(一个或多个)).C:\ Github\MonoAGS\Source\AGS.API\AGS.API.csproj:错误MSB4247:无法加载SDK解析器.存在清单文件,但找不到SDK解析程序DLL文件的路径.清单文件路径'C:\ Program Files(x86)\ Microsoft Visual Studio\2017\BuildTools\MSBuild\15.0\Bin\SdkResolvers\Microsoft.Build.NuGet SdkResolver\Microsoft.Build.NuGetSdkResolver.xml'.SDK解析器路径:C:\ Program Files(x86)\ Microsoft Visual Studio\2017\BuildTools\Common7\IDE\CommonExtens ions\Microsoft\NuGet\Microsoft.Build.NuGetSdkResolver.dll
至于单声道错误,MSBuild\15.0文件夹存在但Microsoft.Common.props不存在(我无法在该机器上的任何其他位置找到它).
至于构建工具错误,该 …