【发布时间】:2020-06-17 01:25:46
【问题描述】:
我目前正在开发一个主动跟踪服务器信息的系统。对于一些方法,我需要它是异步的,但是,有一些是以同步方式实现的(外部库)。我有这个代码:
m_ServerQuery = HServerQuery.Invalid;
m_PingResponse = new ISteamMatchmakingPingResponse(OnServerResponded, OnServerFailedToRespond);
try
{
m_ServerQuery = SteamMatchmakingServers.PingServer((uint)ip, port, m_PingResponse);
await Task.Delay(500);
SteamMatchmakingServers.CancelServerQuery(m_ServerQuery);
}
catch
{
Console.WriteLine($"*** Something went wrong while pinging server ***");
}
从上面的代码 sn-p 中可以看出,PingResponse 类继承了两个方法,当从 Steam 发送响应时,它们作为“回调”工作。现在等待它 0.5 毫秒是可行的,但是,我认为最好实现它以等待这两种方法之一触发:
OnServerResponded, OnServerFailedToRespond
我怎么能做到这一点? ISteamMatchmakingPingResponse 定义:
public class ISteamMatchmakingPingResponse
{
public ISteamMatchmakingPingResponse(ServerResponded onServerResponded, ServerFailedToRespond onServerFailedToRespond);
~ISteamMatchmakingPingResponse();
public static explicit operator IntPtr(ISteamMatchmakingPingResponse that);
public delegate void ServerResponded(gameserveritem_t server);
public delegate void ServerFailedToRespond();
}
【问题讨论】:
-
你可以同步等待
AutoResetEvent,或者如果你想让这个返回任务与async和await一起使用,使用TaskCompletionSource。
标签: c# callback steamworks-api