什么是关闭?我们在.NET中有它们吗?
如果它们确实存在于.NET中,您能否提供一个代码片段(最好用C#)来解释它?
编辑:我浏览了Jon Skeet的文章,了解什么是闭包以及如何在.NET中使用它们.
假设我有一个需要使用InitializeAsync()方法执行异步初始化的类.我想确保初始化只执行一次.如果另一个线程在初始化正在进行时调用此方法,它将"等待"直到第一个调用返回.
我正在考虑以下的实现(使用SemaphoreSlim).有更好/更简单的方法吗?
public class MyService : IMyService
{
private readonly SemaphoreSlim mSemaphore = new SemaphoreSlim(1, 1);
private bool mIsInitialized;
public async Task InitializeAsync()
{
if (!mIsInitialized)
{
await mSemaphore.WaitAsync();
if (!mIsInitialized)
{
await DoStuffOnlyOnceAsync();
mIsInitialized = true;
}
mSemaphore.Release();
}
}
private Task DoStuffOnlyOnceAsync()
{
return Task.Run(() =>
{
Thread.Sleep(10000);
});
}
}
Run Code Online (Sandbox Code Playgroud)
谢谢!
编辑:
由于我正在使用DI并且将注入此服务,因此将其作为"懒惰"资源使用或使用异步工厂对我来说不起作用(尽管在其他用例中它可能很好).因此,异步初始化应该封装在类中,并对IMyService消费者透明.
将初始化代码包装在"虚拟" AsyncLazy<>对象中的想法将完成这项工作,尽管对我来说感觉有点不自然.
如果我请RunSynchronously()一个Task在C#中,这会导致异步调用进一步下跌的兔子洞被同步运行呢?
假设我有一个名为的方法UpdateAsync().在这个方法内部进行了另一次异步调用DoSomethingAsync(),我们再次发现DoSomethingElseAsync(),调用RunSynchronously()'UpdateAsync()'导致RunSynchronously()也间接被调用DoSomethingAsync()?
我的问题的原因:
我有一种情况,我"需要" UpdateAsync()在catch-block中调用异步方法(),并想知道调用它RunSynchronously()是否安全.文档非常清楚,你不能await在catch-block中.(严格来说,我可以在catch-block中使用boolean 并UpdateAsync()在try-catch之后调用,但感觉相当脏).对于双重问题感到抱歉,但是你可能已经理解我不太清楚如何用它来表达它并且对这个领域没有很好的理解.
(编辑: 我不知道如何找出一个方法是否异步调用.你会如何为此编写一个单元测试?是否可以以某种方式记录它?)
说我有一组任务:
var task1 = DoThisAsync(...);
var task2 = DoThatAsync(...);
var task3 = DoOtherAsync(...);
var taskN...
Run Code Online (Sandbox Code Playgroud)
我正在寻找一种方法来按顺序处理一组任务(由包含集合中的位置确定),但让任务只在轮到他们而不是之前运行/启动 - 并且所有这些都包含在其中自己的任务.
问题限制/细节是:
主要问题是,只要我调用相关方法(如DoThis()...)返回每个任务,该任务就已经"热"或正在运行,违反了上面的(2).
我曾尝试使用.ContinueWith(..),但是如果我调用上面的每个任务来设置延续或将它们添加到列表或集合中,那么它们已经开始了.
不确定Lazy <T>是否有帮助但目前看不清楚怎么样?
希望这是有道理的,因为我对async/await/tasks很新.
提前谢谢了.