小编rel*_*dom的帖子

.NET的Monitor类的源代码在哪里?

我很好奇一些低级.NET类是如何实现的.我以Monitor类为例.但是,我似乎无法在GitHub上找到它.我得到的最接近的是Monitor.cscoreclr.但是,此文件中的代码仅引用了大量实用的extern方法[MethodImplAttribute(MethodImplOptions.InternalCall)].

这是我被卡住的地方.我在哪里可以找到这些内部方法的实现?

.net .net-core

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

究竟什么时候同步延续是危险的?

在一篇博客文章中,微软的 Sergey Tepliakov 说:

在创建 TaskCompletionSource 实例时,您应该始终提供 TaskCreationOptions.RunContinuationsAsynchronously。

但是在那篇文章中,除非我误解了它,否则他还说所有的await延续基本上都与TaskCompletionSourcewithout 的行为方式相同TaskCreationOptions.RunContinuationsAsynchronously。因此,这意味着async并且await本质上也是危险的,不应使用,除非await Task.Yield()也使用。

(编辑:我确实误解了它。他说await同步继续是导致问题SetResult行为的原因await Task.Yield()如果无法在源头控制任务创建,建议将其作为客户端解决方法。除非我再次误解了某些东西。)

我的结论是,一定有特定的情况使同步延续变得危险,而且显然这些情况对于TaskCompletionSource用例来说很常见。那些危险的环境是什么?

.net c# asynchronous async-await .net-core

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

无法在Visual Studio 2017诊断工具中获取本机内存快照

我正在使用Visual Studio 2017社区编写C#应用程序。我有一个内存泄漏问题,大概与滥用一个在本机堆上分配内容的DLL有关。我想找出导致DLL不断分配大量内存的方式。

诊断工具凭借其内存快照功能,似乎是完成此任务的理想工具。不幸的是,内存快照仅提供有关托管堆的信息,在我看来,这是非常稳定的。

我尝试在运行调试器之前转到“诊断工具”设置->“内存探查器工具”->“配置”->“使用快照启用本机堆分析”,但是我仍然只能在快照中获取托管堆信息。

我尝试启动调试器时未启用本机堆性能分析,中断并仅启用本机堆性能分析。如果我尝试拍摄快照,则诊断工具将陷入“ 拍摄快照...”进度条。

有人有类似的问题吗?

c# profiling memory-leaks visual-studio diagnostic-tools

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

async 和 await 会产生获取和释放语义吗?

我找不到关于从async方法返回是否总是产生释放语义以及是否await总是产生获取语义的明确答案。我假设是的,因为否则任何async/await代码都会成为雷区?

所以这是一个例子:是否保证返回值都是100*212345*2,没有任何明确的锁或障碍?

private static async Task<(int, int)> AMethod()
{
    // Runs on the original thread:
    var x = 100;
    var y = 12345;

    var task = Task.Run(() =>
    {
        // Can run on another thread:
        x *= 2;
        y *= 2;

        // Implicit return here, marking the task completed.
        // Release semantics or not?
    });

    await task; // Acquire semantics or not?

    // Runs on the original thread:
    return (x, …
Run Code Online (Sandbox Code Playgroud)

.net c# memory-model language-lawyer async-await

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