1

それが私のコードです:

<input type="button" id="SignOut" value="SignOut"  onclick="logout();" />

サーバ側:

public void ondisconnected() // when the user is disconnected
{
    try
    { 
        DataRow[] UserRow = ConnectedClientDt.Select("ConnectionID='" + Context.ConnectionId + "'");
        int ClientID = Convert.ToInt32(UserRow[0][0]);
        new SQLHelper(SQLHelper.ConnectionStrings.WebSiteConnectionString).Update("Update clients set USER_STATUS='F' where CLIENT_ID=" + ClientID);
        string query = " Select FRIEND_ID from friends where CLIENT_ID= " + ClientID;
        DataTable FriendsDt = new SQLHelper(SQLHelper.ConnectionStrings.WebSiteConnectionString).getQueryResult(query);
        for (int i = 0; i < FriendsDt.Rows.Count; i++)
        {
            DataRow[] FrRow = ConnectedClientDt.Select("ClientId=" + FriendsDt.Rows[i][0] + "");
            if (FrRow.Length > 0)
                Clients.Client(FrRow[0][2].ToString()).userDisconnected(ClientID);
        }
        DeleteUser(Context.ConnectionId);  
    }
    catch (Exception ex)
    {
        return ;
    }
}

クライアント側:

function logout() {
    $.connection.chatHub.server.ondisconnected();
    setTimeout(window.location= "LoginPage.aspx?action=logout", 5000);
}

ボタンを押してもondisconnected関数は実行されませんが、settimeout行を削除するとコードは問題なく正常に動作します:s

4

1 に答える 1

3

この次のコードは、評価された瞬間にトリガーwindow.locationされますが、これはあなたが望んでいるものではありません:

setTimeout(window.location= "LoginPage.aspx?action=logout", 5000);

必要なもの:

setTimeout(function(){window.location="LoginPage.aspx?action=logout"}, 5000);

コードを関数でラップすることにより、関数が呼び出されたときにのみ実行され、5 秒後に実行されます。以前のバージョンでは、サーバーと通信する時間がなかったことをwindow.location意味し、すぐに評価されていました。signalr

于 2013-03-16T11:18:50.363 に答える