如何在后台实现UDP监听器?(可用于log4net)

Meh*_*rad 0 c# log4net asynchronous backgroundworker async-await

我想UDPListener在后台运行它:

// launch this in a background thread
private static void UDPListen()
{
    IPEndPoint remoteEndPoint = new IPEndPoint(IPAddress.Any, 0)
    using( var udpClient = new UdpClient(10000)) 
    {
       while (true)
       {
           var buffer = udpClient.Receive(ref remoteEndPoint);
           var loggingEvent = System.Text.Encoding.Unicode.GetString(buffer);
           // ...
       }
    }
}
Run Code Online (Sandbox Code Playgroud)

我可以把它放在一个Task.Run()并在while()循环中运行吗?

Meh*_*rad 6

这是我在阅读后进行设置的方法.非常简单!

异步方法

    private static void UDPListener()
    {
        Task.Run(async () =>
        {
            using (var udpClient = new UdpClient(11000))
            {
                string loggingEvent = "";
                while (true)
                {
                    //IPEndPoint object will allow us to read datagrams sent from any source.
                    var receivedResults = await udpClient.ReceiveAsync();
                    loggingEvent += Encoding.ASCII.GetString(receivedResults.Buffer);
                }
            }
        });
    }
Run Code Online (Sandbox Code Playgroud)

appenderlog4net的 config文件应设置为一样的东西:

</log4net>
    <appender name="UdpAppender" type="log4net.Appender.UdpAppender">
        <remoteAddress value="127.0.0.1" />
        <remotePort value="11000" />
        <layout type="log4net.Layout.PatternLayout, log4net">
            <conversionPattern value="%-5level %logger [%property{NDC}] - %message%newline" />
        </layout>
    </appender>

    <root>
        <appender-ref ref="UdpAppender" />

    </root>
</log4net>
Run Code Online (Sandbox Code Playgroud)

同步方法

与上述asynchronous方法一样,这也可以在synchronous方法中以非常类似的方式实现:

    private static void UDPListener()
    {
        Task.Run(() =>
        {
            using (var udpClient = new UdpClient(11000))
            {
                string loggingEvent = "";
                while (true)
                {
                    //IPEndPoint object will allow us to read datagrams sent from any source.
                    var remoteEndPoint = new IPEndPoint(IPAddress.Any, 0);
                    var receivedResults = udpClient.Receive(ref remoteEndPoint);
                    loggingEvent += Encoding.ASCII.GetString(receivedResults);
                }
            }
        });
    }
Run Code Online (Sandbox Code Playgroud)