[英]How to wait for a one of callbacks method response before continuing the code?
我目前正在開發一個系統,該系統可以主動跟蹤服務器信息。 對於一些方法,我需要它是異步的,但是,有一些以同步方式(外部庫)實現。 我有這個代碼:
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 ***");
}
正如您從 PingResponse 上面的代碼片段中看到的那樣,class 繼承了兩種方法,當從 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();
}
我假設OnServerResponded
和OnServerFailedToRespond
是您可以修改的函數。 您可以使用TaskCompletionSource<bool>
並等待它的任務。 像這樣的東西。
TaskCompletionSource<bool> pingSucceed;
//Not sure about the firm of your callback functions, just a void function for this example
void OnServerResponded()
{
//Do any task you need to do
//..
if(pingSucceed != null)
pingSucceed.TrySetResult(true);
}
void OnServerFailedToRespond()
{
//Do any task you need to do
//..
if(pingSucceed != null)
pingSucceed.TrySetResult(false);
}
//Now the call
async Task TheFunctionThatPingsTheServer()
{
//Do any task you need to do prior to the ping
//..
pingSucceed = new TaskCompletionSource<bool>();
m_ServerQuery = SteamMatchmakingServers.PingServer((uint)ip, port, m_PingResponse);
var succeed = await pingSucceed.Task;
pingSucceed.Dispose();
pingSucceed = null;
//Here succeed will be true if server answered, else false.
}
請注意這一點,如果OnServerResponded
和/或OnServerFailedToRespond
在不同的線程中運行,那么您必須通過鎖定 object 來保護對pingSucceed
的所有訪問以避免競爭條件。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.