簡體   English   中英

如何在繼續代碼之前等待一個回調方法響應?

[英]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();
}

我假設OnServerRespondedOnServerFailedToRespond是您可以修改的函數。 您可以使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM