异步 NetMQ 抛出“在调用异步函数之前必须创建 NetMQRuntime”

Async NetMQ throws "NetMQRuntime must be created before calling async functions"

提问人:Kodo 提问时间:11/17/2023 最后编辑:jpsKodo 更新时间:11/17/2023 访问量:26

问:

我有两个使用 NetMQ (v4.0.1.13) 的 .Net 7 控制台应用程序,并且它们都有类似的程序类 - 只是异步任务不同:

class Program
{

    private static readonly CancellationTokenSource cts = new();

    static void Main(string[] args)
    {
        AppDomain.CurrentDomain.ProcessExit += CurrentDomain_ProcessExit;
        var runtime = new NetMQRuntime();
        runtime.Run(cts.Token, <async client | server task here>);
    }

    private static void CurrentDomain_ProcessExit(object? sender, EventArgs e)
    {
        try
        {
            cts.Cancel();
        }
        catch { }
        finally
        {
            NetMQConfig.Cleanup();
        }
    }
}

“客户端”具有以下特征:

using var requestSocket = new RequestSocket();
requestSocket.Connect("tcp://localhost:5555");

...

requestSocket.SendMultipartMessage(newBlockMessage); // Step 1
// This line throws the "NetMQRuntime must be created before calling async functions" exception!
var result = await requestSocket.ReceiveFrameStringAsync(); // Step 4

“server”包含以下行:

using var responseSocket = new ResponseSocket();
responseSocket.Bind("tcp://localhost:5555");

...
NetMQMessage messages = await responseSocket.ReceiveMultipartMessageAsync(); // Step 2

...

//This line results in the client exception above
ResponseSocket.SendFrame(SystemEvent.EventTypes.NewBlockAndTransferEventStored.ToString()); // Step 3

我已经为此苦苦挣扎了一段时间,无法理解客户端和服务器的程序类中的初始化代码有什么不同。我将消息流概述为“步骤 (n)”,以阐明消息交换。感觉就像我在客户端初始化中缺少一些非常基本的东西,但我无法识别它。 由于未知的原因,“服务器”应用程序似乎可以很好地处理 aync(它没有抱怨),而“客户端”在接收“服务器”回复的步骤 4 中抛出异常。

C# 异步 await netmq

评论


答: 暂无答案