async一次等待一个任务

Dmi*_*hin 6 c# multithreading asynchronous

在我的求职面试中,我被赋予了一个任务,即通过一些长时间运行的方法创建一个异步包装器,处理一些数据,但要创建它,以便一次只能运行一个任务.我对async/await模式并不是很熟悉,所以我尽力而为,在任务风格和事件风格之间写了一些混合,以便我的包装器正在执行当前正在执行的任务,并公开公共方法和公共事件.方法将数据作为参数进行处理,如果没有任务正在运行,则启动一个任务,如果有任务,则将数据排入队列.任务在完成时提升了公共事件,即向订阅者发送流程结果并在有任何入队时开始新任务.

所以,正如你可能猜到的那样,我没有通过采访,但是现在我做了一些研究,我正在试图弄清楚如何正确地做它(它应该也是线程安全的,但我太忙了担心这一点).所以我的问题是,如果我有的话

public class SynchronousProcessor
{
    public string Process(string arg)
    {
        Thread.Sleep(1500); //Work imitation
        return someRandomString;
    }
}

public class AsynchronousWrapper
{
    SynchronousProcessor proc = new SynchronousProcessor();

    public async Task<string> ProcessAsync(string arg)
    {
        return Task.Run(() => proc.Process(arg));
    } 
}
Run Code Online (Sandbox Code Playgroud)

,或类似的东西,ProcessAsync(string)如果已经执行任务,如何正确处理调用?

Ste*_*ary 5

许多求职面试问题的目的不是为了看你写代码。通常,问题有点含糊,特别是看您提出的澄清问题 -您的问题决定了您的表现。在白板上编写代码充其量是次要的。

我的任务是在一些长时间运行的方法上创建一个异步包装器,处理一些数据

第一个问题:这个长时间运行的方法是异步的吗?如果是这样,那么就不需要Task.Run. 但如果不是...

后续问题:如果它不是异步的,应该是吗?即,它是基于 I/O 的吗?如果是这样,那么我们可以投入时间使其正确异步。但如果不是...

后续问题:如果我们需要一个任务包装器(围绕基于 CPU 的代码或围绕阻塞 I/O 代码),环境是否适合包装器?即,这是一个桌面/移动应用程序,而不是将在 ASP.NET 中使用的代码?

创建它以便一次只能运行一个任务。

澄清问题:如果第二个请求已经在运行,第二个请求是否“排队”?或者它会与现有请求“合并”吗?如果合并,他们是否需要“关闭”输入数据 - 或输入数据的某个子集?

这些问题中的每一个都会改变答案的结构。

公开一个公共方法和一个公共事件。

这可能是扔它的原因。在Task<T>/IProgress<T>和 Rx 之间,很少需要事件。只有当你所在的团队不会学习 Rx 时,才应该使用它们。

哦,不要担心“失败”面试。在我的职业生涯中,我“失败”了超过 2/3 的面试。我只是不擅长面试。