C# 等待回调

C# 等待回调,c#,wait,C#,Wait,我有一个服务,它接收请求并逐步处理它们(使用ActionBlock) 有时我需要等到它被处理。我可以选择输入回调。有没有办法暂停运行直到调用回调 类似这样,但更好: bool complete = true; service.AddRequest(new ServiceRequest() { OnComplete = (req) => { complete = true; } });

我有一个服务,它接收请求并逐步处理它们(使用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
    }
}
公共类服务
{
受保护的ActionBlock请求;
公共服务()
{
请求=新操作块(请求=>{
//什么也不做
睡眠(1000);
请求OnComplete?调用(请求);
});
}
public void AddRequest(ServiceRequest ServiceRequest)=>Requests.Post(ServiceRequest);
}
公共类服务请求
{
完成公共行动;
串福;
}
公共类应用程序
{
公共静态void Start()
{
var服务=新服务();
AddRequest(新的ServiceRequest());
//我需要等待处理
//臭代码!!
bool complete=true;
service.AddRequest(新的ServiceRequest()
{
OnComplete=(请求)=>
{
完整=正确;
}
});
同时(!完成)线程睡眠(100);
//臭代码!!结束
}
}

您的代码中有错误,
complete
的初始值应为false;)

要防止循环中的活动等待,您可以使用
AutoResetEvent

AutoResetEvent completedEv = new AutoResetEvent();
service.AddRequest(new ServiceRequest()
{
    OnComplete = (req) =>
    {
        completedEv.Set();
    }
});

completedEv.WaitOne();

注意:
AutoResetEvent
实现了
IDisposable
接口,因此您必须确保即使在出现错误的情况下也会对其进行处理。

这是否回答了您的问题?
AutoResetEvent completedEv = new AutoResetEvent();
service.AddRequest(new ServiceRequest()
{
    OnComplete = (req) =>
    {
        completedEv.Set();
    }
});

completedEv.WaitOne();