在我的面试中,我被要求创建一个异步包装器来处理一些长时间运行的方法,处理一些数据,但是要创建它,以便只能同时运行一个任务。我对
所以,你可能已经猜到了,我在面试中失败了,但现在我做了一些研究,正在尝试弄清楚如何正确地完成它(它也应该是线程安全的,但我太忙于担心这个问题)。所以我的问题是,如果我有...
如果已经有一个任务正在执行,我应该如何正确处理对
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));
}
}
如果已经有一个任务正在执行,我应该如何正确处理对
ProcessAsync(string)
的调用?
SynchronousProcessor
类应该被视为库类,因此其代码保持不变。 - Dmitry PavlushinTask.Run
是完全可以的,因为它周围也会有一些非平凡的逻辑。 - Kevin Gosselock
,而是使用带有异步调用的SemaphoreSlim
。lock
无法包装异步调用,但SemaphoreSlim
可以。https://msdn.microsoft.com/zh-cn/library/system.threading.semaphoreslim(v=vs.110).aspx,https://gist.github.com/tugberkugurlu/5917020 - ps2goat