等待回调
Wait for callback
我有一个接收请求并逐步处理它们的服务(使用 ActionBlock)。
有时我需要等到处理完毕。我可以选择输入回调。有没有办法暂停 运行 直到回调被调用?
类似这样,但更好:
bool complete = true;
service.AddRequest(new ServiceRequest()
{
OnComplete = (req) =>
{
complete = true;
}
});
while (!complete) Thread.Sleep(100);
较长的上下文代码:
public class Service
{
protected ActionBlock<ServiceRequest> Requests;
public Service()
{
Requests = new ActionBlock<ServiceRequest>(req => {
// do noting
Thread.Sleep(1000);
req.OnComplete?.Invoke(req);
});
}
public void AddRequest(ServiceRequest serviceRequest) => Requests.Post(serviceRequest);
}
public class ServiceRequest
{
public Action<ServiceRequest> OnComplete;
string Foo;
}
public class App
{
public static void Start()
{
var service = new Service();
service.AddRequest(new ServiceRequest());
// I need to wait for processing
// smelly code!!
bool complete = true;
service.AddRequest(new ServiceRequest()
{
OnComplete = (req) =>
{
complete = true;
}
});
while (!complete) Thread.Sleep(100);
// smelly code!! end
}
}
你的代码有误,complete
的初始值应该是false ;)
bool complete = false; // initial value
service.AddRequest(new ServiceRequest()
{
OnComplete = (req) =>
{
complete = true;
}
});
while (!complete) Thread.Sleep(100);
要防止在循环中主动等待,您可以使用 AutoResetEvent
:
AutoResetEvent completedEv = new AutoResetEvent();
service.AddRequest(new ServiceRequest()
{
OnComplete = (req) =>
{
completedEv.Set();
}
});
completedEv.WaitOne();
注意:AutoResetEvent
实现了 IDisposable
接口,因此您必须确保即使在错误情况下它也会被释放。
我有一个接收请求并逐步处理它们的服务(使用 ActionBlock)。
有时我需要等到处理完毕。我可以选择输入回调。有没有办法暂停 运行 直到回调被调用?
类似这样,但更好:
bool complete = true;
service.AddRequest(new ServiceRequest()
{
OnComplete = (req) =>
{
complete = true;
}
});
while (!complete) Thread.Sleep(100);
较长的上下文代码:
public class Service
{
protected ActionBlock<ServiceRequest> Requests;
public Service()
{
Requests = new ActionBlock<ServiceRequest>(req => {
// do noting
Thread.Sleep(1000);
req.OnComplete?.Invoke(req);
});
}
public void AddRequest(ServiceRequest serviceRequest) => Requests.Post(serviceRequest);
}
public class ServiceRequest
{
public Action<ServiceRequest> OnComplete;
string Foo;
}
public class App
{
public static void Start()
{
var service = new Service();
service.AddRequest(new ServiceRequest());
// I need to wait for processing
// smelly code!!
bool complete = true;
service.AddRequest(new ServiceRequest()
{
OnComplete = (req) =>
{
complete = true;
}
});
while (!complete) Thread.Sleep(100);
// smelly code!! end
}
}
你的代码有误,complete
的初始值应该是false ;)
bool complete = false; // initial value
service.AddRequest(new ServiceRequest()
{
OnComplete = (req) =>
{
complete = true;
}
});
while (!complete) Thread.Sleep(100);
要防止在循环中主动等待,您可以使用 AutoResetEvent
:
AutoResetEvent completedEv = new AutoResetEvent();
service.AddRequest(new ServiceRequest()
{
OnComplete = (req) =>
{
completedEv.Set();
}
});
completedEv.WaitOne();
注意:AutoResetEvent
实现了 IDisposable
接口,因此您必须确保即使在错误情况下它也会被释放。