小编tza*_*chs的帖子

为什么在UI线程上输入锁定会触发OnPaint事件?

我遇到了一些我根本不理解的东西.在我的应用程序中,我有几个线程都将项目添加(和删除)到共享集合(使用共享锁).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)

c# multithreading winforms

9
推荐指数
2
解决办法
3277
查看次数

调试器忽略的 TypeScript toString

作为对此的后续问题: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 没有关系,结果是一样的。

google-chrome-devtools typescript visual-studio-code

5
推荐指数
1
解决办法
550
查看次数

如何使用msbuild从命令行编译我的c#解决方案

我有一个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不存在(我无法在该机器上的任何其他位置找到它).

至于构建工具错误,该 …

c# msbuild mono visual-studio-2017

3
推荐指数
1
解决办法
4531
查看次数