相关疑难解决方法(0)

什么是.NET中的'闭包'?

什么是关闭?我们在.NET中有它们吗?


如果它们确实存在于.NET中,您能否提供一个代码片段(最好用C#)来解释它?


编辑:我浏览了Jon Skeet的文章,了解什么是闭包以及如何在.NET中使用它们.

.net closures

190
推荐指数
4
解决办法
4万
查看次数

强制执行一次异步方法

假设我有一个需要使用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<>对象中的想法将完成这项工作,尽管对我来说感觉有点不自然.

.net c# asynchronous task-parallel-library async-await

13
推荐指数
3
解决办法
2301
查看次数

Task.RunSynchronously()是否"递归"工作?

如果我请RunSynchronously()一个Task在C#中,这会导致异步调用进一步下跌的兔子洞被同步运行呢?

假设我有一个名为的方法UpdateAsync().在这个方法内部进行了另一次异步调用DoSomethingAsync(),我们再次发现DoSomethingElseAsync(),调用RunSynchronously()'UpdateAsync()'导致RunSynchronously()也间接被调用DoSomethingAsync()

我的问题的原因: 我有一种情况,我"需要" UpdateAsync()catch-block中调用异步方法(),并想知道调用它RunSynchronously()是否安全.文档非常清楚,你不能awaitcatch-block中.(严格来说,我可以在catch-block中使用boolean 并UpdateAsync()在try-catch之后调用,但感觉相当脏).对于双重问题感到抱歉,但是你可能已经理解我不太清楚如何用它来表达它并且对这个领域没有很好的理解.

(编辑: 我不知道如何找出一个方法是否异步调用.你会如何为此编写一个单元测试?是否可以以某种方式记录它?)

c# asynchronous .net-4.0 async-await

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

如何延迟"热"任务,以便按设定顺序处理它们

说我有一组任务:

        var task1 = DoThisAsync(...);
        var task2 = DoThatAsync(...);
        var task3 = DoOtherAsync(...);
        var taskN...
Run Code Online (Sandbox Code Playgroud)

我正在寻找一种方法来按顺序处理一组任务(由包含集合中的位置确定),但让任务只在轮到他们而不是之前运行/启动 - 并且所有这些都包含在其中自己的任务.

问题限制/细节是:

  1. 这些任务需要按特定顺序执行ietask1,task2,...
  2. 上一个任务必须在下一个任务开始之前异步完成
  3. 任务数量是可变的
  4. 每次运行代码时,都可以指定一组不同的任务
  5. 任务的顺序和数量是事先已知的.

主要问题是,只要我调用相关方法(如DoThis()...)返回每个任务,该任务就已经"热"或正在运行,违反了上面的(2).

我曾尝试使用.ContinueWith(..),但是如果我调用上面的每个任务来设置延续或将它们添加到列表或集合中,那么它们已经开始了.

不确定Lazy <T>是否有帮助但目前看不清楚怎么样?

希望这是有道理的,因为我对async/await/tasks很新.

提前谢谢了.

c# asynchronous task task-parallel-library async-await

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