我很好奇一些低级.NET类是如何实现的.我以Monitor类为例.但是,我似乎无法在GitHub上找到它.我得到的最接近的是Monitor.cs在coreclr.但是,此文件中的代码仅引用了大量实用的extern方法[MethodImplAttribute(MethodImplOptions.InternalCall)].
这是我被卡住的地方.我在哪里可以找到这些内部方法的实现?
在一篇博客文章中,微软的 Sergey Tepliakov 说:
在创建 TaskCompletionSource 实例时,您应该始终提供 TaskCreationOptions.RunContinuationsAsynchronously。
但是在那篇文章中,除非我误解了它,否则他还说所有的await延续基本上都与TaskCompletionSourcewithout 的行为方式相同TaskCreationOptions.RunContinuationsAsynchronously。因此,这意味着async并且await本质上也是危险的,不应使用,除非await Task.Yield()也使用。
(编辑:我确实误解了它。他说await同步继续是导致问题SetResult行为的原因。await Task.Yield()如果无法在源头控制任务创建,建议将其作为客户端解决方法。除非我再次误解了某些东西。)
我的结论是,一定有特定的情况使同步延续变得危险,而且显然这些情况对于TaskCompletionSource用例来说很常见。那些危险的环境是什么?
我正在使用Visual Studio 2017社区编写C#应用程序。我有一个内存泄漏问题,大概与滥用一个在本机堆上分配内容的DLL有关。我想找出导致DLL不断分配大量内存的方式。
诊断工具凭借其内存快照功能,似乎是完成此任务的理想工具。不幸的是,内存快照仅提供有关托管堆的信息,在我看来,这是非常稳定的。
我尝试在运行调试器之前转到“诊断工具”设置->“内存探查器工具”->“配置”->“使用快照启用本机堆分析”,但是我仍然只能在快照中获取托管堆信息。
我尝试启动调试器时未启用本机堆性能分析,中断并仅启用本机堆性能分析。如果我尝试拍摄快照,则诊断工具将陷入“ 拍摄快照...”进度条。
有人有类似的问题吗?
我找不到关于从async方法返回是否总是产生释放语义以及是否await总是产生获取语义的明确答案。我假设是的,因为否则任何async/await代码都会成为雷区?
所以这是一个例子:是否保证返回值都是100*2和12345*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 ×3
c# ×3
.net-core ×2
async-await ×2
asynchronous ×1
memory-leaks ×1
memory-model ×1
profiling ×1