我一直在做一些研究,并且明白非阻塞方法是一种方法,如果返回时间太长也不会阻止它的调用线程 - 换句话说,它会立即返回一些东西。那么,如果它没有东西可以返回,它会返回什么?
答案 0 :(得分:1)
所以,如果它没有东西可以返回,它会返回什么?
无。函数几乎不能在所有语言中返回任何内容
例如,在C ++中void f() { return; }
是函数的有效定义。
无论如何,通常在回调通常是要走的过程中会看到这些功能
例如,libuv
是一个几乎完全基于回调的C库
在这种情况下,您通常会传递回调对象(该对象主要取决于语言,例如它可以是函数指针(C), lambda函数或仿函数(C ++),Function
(JS)的实例或其他。
这样,被调用的方法可以自由地启动异步操作,并在通过回调完成后回调给调用者。
作为一个更具体的例子,假设您想要发出http请求 您可以执行阻塞调用来停止执行调用线程,直到响应到达,然后它将数据作为您调用的函数的返回值返回。 否则,您可以设计一个接受回调的函数,启动http调用并返回。无论何时收到响应,都将异步调用您的回调。
答案 1 :(得分:1)
通常在非阻塞模式中,处理程序(可能是函数或事件)用于在调用者和被调用者之间进行通信。当调用者进行非阻塞调用时,它要么传递该处理程序,要么已经与被调用者共享它。被调用者立即返回一些状态,如正在进行或可能为null。每当被调用者完成该工作时,它就会调用处理程序状态,并且调用者通过它来了解进度。
答案 2 :(得分:1)
非阻塞方法将接受回调,或触发事件,或返回“future”,或使用其他异步延续机制(例如C#6中的async
/ await
)。
所以,你可能有:
void Process(Action<Data> whenFinishedInvokeThis)
{
Task.Run(() =>
{
var data = DoSomeLongCalculation();
whenFinishedInvokeThis(data);
});
}
或者:
public event Action<Data> Finished;
void Process()
{
Task.Run(() =>
{
var data = DoSomeLongCalculation();
Finished?.Invoke(data);
});
}
或者:
Task<Data> Process()
{
return Task.Run(DoSomeLongCalculation);
}
或者:
async Task<Data> Process()
{
return await Task.Run(DoSomeLongCalculation);
}