11#if ( NET_4_6 || NET_STANDARD_2_0 )
22using System ;
3+ using System . Threading ;
34using System . Threading . Tasks ;
45using ExitGames . Client . Photon ;
56using UnityEngine ;
@@ -8,87 +9,112 @@ namespace PhotonRx
89{
910 public static class PhotonTask
1011 {
11-
1212 #region Connect
13- public static Task < IResult < DisconnectCause , bool > > ConnectToBestCloudServer ( string gameVersion )
13+
14+ public static Task < IResult < DisconnectCause , bool > > ConnectToBestCloudServer ( string gameVersion ,
15+ CancellationToken cancellationToken = default ( CancellationToken ) )
1416 {
15- return Connect ( ( ) => PhotonNetwork . ConnectToBestCloudServer ( gameVersion ) ) ;
17+ return Connect ( ( ) => PhotonNetwork . ConnectToBestCloudServer ( gameVersion ) , cancellationToken ) ;
1618 }
1719
18- public static Task < IResult < DisconnectCause , bool > > ConnectToMaster ( string masterServerAddress , int port , string appID , string gameVersion )
20+ public static Task < IResult < DisconnectCause , bool > > ConnectToMaster ( string masterServerAddress , int port ,
21+ string appID , string gameVersion , CancellationToken cancellationToken = default ( CancellationToken ) )
1922 {
20- return Connect ( ( ) => PhotonNetwork . ConnectToMaster ( masterServerAddress , port , appID , gameVersion ) ) ;
23+ return Connect ( ( ) => PhotonNetwork . ConnectToMaster ( masterServerAddress , port , appID , gameVersion ) ,
24+ cancellationToken ) ;
2125 }
2226
23- public static Task < IResult < DisconnectCause , bool > > ConnectToRegion ( CloudRegionCode region , string gameVersion )
27+ public static Task < IResult < DisconnectCause , bool > > ConnectToRegion ( CloudRegionCode region , string gameVersion ,
28+ CancellationToken cancellationToken = default ( CancellationToken ) )
2429 {
25- return Connect ( ( ) => PhotonNetwork . ConnectToRegion ( region , gameVersion ) ) ;
30+ return Connect ( ( ) => PhotonNetwork . ConnectToRegion ( region , gameVersion ) , cancellationToken ) ;
2631 }
2732
28- public static Task < IResult < DisconnectCause , bool > > ConnectUsingSettings ( string gameVersion )
33+ public static Task < IResult < DisconnectCause , bool > > ConnectUsingSettings ( string gameVersion ,
34+ CancellationToken cancellationToken = default ( CancellationToken ) )
2935 {
30- return Connect ( ( ) => PhotonNetwork . ConnectUsingSettings ( gameVersion ) ) ;
36+ return Connect ( ( ) => PhotonNetwork . ConnectUsingSettings ( gameVersion ) , cancellationToken ) ;
3137 }
3238
33- private static Task < IResult < DisconnectCause , bool > > Connect ( Action connectAction )
39+ private static async Task < IResult < DisconnectCause , bool > > Connect ( Action connectAction ,
40+ CancellationToken cancellationToken )
3441 {
3542 var eventHook = GetOrAddComponent < ConnectionEventHook > ( PhotonEventManager . Instance . gameObject ) ;
36- return eventHook . Connect ( connectAction ) ;
43+ var result = await eventHook . Connect ( connectAction ) . WithCancellation ( cancellationToken ) ;
44+ return result ;
3745 }
3846
3947 #endregion
4048
4149 #region JoinRoom
4250
43- public static Task < IResult < FailureReason , bool > > CreateRoom ( string roomName )
51+ public static Task < IResult < FailureReason , bool > > CreateRoom ( string roomName ,
52+ CancellationToken cancellationToken = default ( CancellationToken ) )
4453 {
45- return JoinRoom ( ( ) => PhotonNetwork . CreateRoom ( roomName ) ) ;
54+ return JoinRoom ( ( ) => PhotonNetwork . CreateRoom ( roomName ) , cancellationToken ) ;
4655 }
4756
48- public static Task < IResult < FailureReason , bool > > CreateRoom ( string roomName , RoomOptions roomOptions , TypedLobby typedLobby )
57+ public static Task < IResult < FailureReason , bool > > CreateRoom ( string roomName , RoomOptions roomOptions ,
58+ TypedLobby typedLobby , CancellationToken cancellationToken = default ( CancellationToken ) )
4959 {
50- return JoinRoom ( ( ) => PhotonNetwork . CreateRoom ( roomName , roomOptions , typedLobby ) ) ;
60+ return JoinRoom ( ( ) => PhotonNetwork . CreateRoom ( roomName , roomOptions , typedLobby ) , cancellationToken ) ;
5161 }
5262
53- public static Task < IResult < FailureReason , bool > > CreateRoom ( string roomName , RoomOptions roomOptions , TypedLobby typedLobby , string [ ] expectedUsers )
63+ public static Task < IResult < FailureReason , bool > > CreateRoom ( string roomName , RoomOptions roomOptions ,
64+ TypedLobby typedLobby , string [ ] expectedUsers ,
65+ CancellationToken cancellationToken = default ( CancellationToken ) )
5466 {
55- return JoinRoom ( ( ) => PhotonNetwork . CreateRoom ( roomName , roomOptions , typedLobby , expectedUsers ) ) ;
67+ return JoinRoom ( ( ) => PhotonNetwork . CreateRoom ( roomName , roomOptions , typedLobby , expectedUsers ) ,
68+ cancellationToken ) ;
5669 }
5770
58- public static Task < IResult < FailureReason , bool > > JoinRoom ( string roomName )
71+ public static Task < IResult < FailureReason , bool > > JoinRoom ( string roomName ,
72+ CancellationToken cancellationToken = default ( CancellationToken ) )
5973 {
60- return JoinRoom ( ( ) => PhotonNetwork . JoinRoom ( roomName ) ) ;
74+ return JoinRoom ( ( ) => PhotonNetwork . JoinRoom ( roomName ) , cancellationToken ) ;
6175 }
6276
63- public static Task < IResult < FailureReason , bool > > JoinOrCreateRoom ( string roomName , RoomOptions roomOptions , TypedLobby typedLobby , string [ ] expectedUsers = null )
77+ public static Task < IResult < FailureReason , bool > > JoinOrCreateRoom ( string roomName , RoomOptions roomOptions ,
78+ TypedLobby typedLobby , string [ ] expectedUsers = null ,
79+ CancellationToken cancellationToken = default ( CancellationToken ) )
6480 {
65- return JoinRoom ( ( ) => PhotonNetwork . JoinOrCreateRoom ( roomName , roomOptions , typedLobby , expectedUsers ) ) ;
81+ return JoinRoom ( ( ) => PhotonNetwork . JoinOrCreateRoom ( roomName , roomOptions , typedLobby , expectedUsers ) ,
82+ cancellationToken ) ;
6683 }
6784
68- public static Task < IResult < FailureReason , bool > > JoinRandomRoom ( )
85+ public static Task < IResult < FailureReason , bool > > JoinRandomRoom (
86+ CancellationToken cancellationToken = default ( CancellationToken ) )
6987 {
70- return JoinRoom ( ( ) => PhotonNetwork . JoinRandomRoom ( ) ) ;
88+ return JoinRoom ( ( ) => PhotonNetwork . JoinRandomRoom ( ) , cancellationToken ) ;
7189 }
7290
73- public static Task < IResult < FailureReason , bool > > JoinRandomRoom ( Hashtable expectedCustomRoomProperties , byte expectedMaxPlayers )
91+ public static Task < IResult < FailureReason , bool > > JoinRandomRoom ( Hashtable expectedCustomRoomProperties ,
92+ byte expectedMaxPlayers , CancellationToken cancellationToken = default ( CancellationToken ) )
7493 {
75- return JoinRoom ( ( ) => PhotonNetwork . JoinRandomRoom ( expectedCustomRoomProperties , expectedMaxPlayers ) ) ;
94+ return JoinRoom ( ( ) => PhotonNetwork . JoinRandomRoom ( expectedCustomRoomProperties , expectedMaxPlayers ) ,
95+ cancellationToken ) ;
7696 }
7797
78- public static Task < IResult < FailureReason , bool > > JoinRandomRoom ( Hashtable expectedCustomRoomProperties , byte expectedMaxPlayers , MatchmakingMode matchingType , TypedLobby typedLobby , string sqlLobbyFilter , string [ ] expectedUsers = null )
98+ public static Task < IResult < FailureReason , bool > > JoinRandomRoom ( Hashtable expectedCustomRoomProperties ,
99+ byte expectedMaxPlayers , MatchmakingMode matchingType , TypedLobby typedLobby , string sqlLobbyFilter ,
100+ string [ ] expectedUsers = null , CancellationToken cancellationToken = default ( CancellationToken ) )
79101 {
80- return JoinRoom ( ( ) => PhotonNetwork . JoinRandomRoom ( expectedCustomRoomProperties , expectedMaxPlayers , matchingType , typedLobby , sqlLobbyFilter , expectedUsers ) ) ;
102+ return JoinRoom ( ( ) => PhotonNetwork . JoinRandomRoom ( expectedCustomRoomProperties , expectedMaxPlayers ,
103+ matchingType , typedLobby , sqlLobbyFilter , expectedUsers ) , cancellationToken ) ;
81104 }
82105
83- public static Task < IResult < FailureReason , bool > > ReJoinRoom ( string roomName )
106+ public static Task < IResult < FailureReason , bool > > ReJoinRoom ( string roomName ,
107+ CancellationToken cancellationToken = default ( CancellationToken ) )
84108 {
85- return JoinRoom ( ( ) => PhotonNetwork . ReJoinRoom ( roomName ) ) ;
109+ return JoinRoom ( ( ) => PhotonNetwork . ReJoinRoom ( roomName ) , cancellationToken ) ;
86110 }
87111
88- private static Task < IResult < FailureReason , bool > > JoinRoom ( Action joinAction )
112+ private static async Task < IResult < FailureReason , bool > > JoinRoom ( Action joinAction ,
113+ CancellationToken cancellationToken )
89114 {
90115 var eventHook = GetOrAddComponent < RoomEventHook > ( PhotonEventManager . Instance . gameObject ) ;
91- return eventHook . Join ( joinAction ) ;
116+ var result = await eventHook . Join ( joinAction ) . WithCancellation ( cancellationToken ) ;
117+ return result ;
92118 }
93119
94120 #endregion
@@ -104,6 +130,18 @@ private static T GetOrAddComponent<T>(GameObject gameObject)
104130
105131 return component ;
106132 }
133+
134+ // from https://blogs.msdn.microsoft.com/pfxteam/2012/10/05/how-do-i-cancel-non-cancelable-async-operations/
135+ public static async Task < T > WithCancellation < T > (
136+ this Task < T > task , CancellationToken cancellationToken )
137+ {
138+ var tcs = new TaskCompletionSource < bool > ( ) ;
139+ using ( cancellationToken . Register (
140+ s => ( ( TaskCompletionSource < bool > ) s ) . TrySetResult ( true ) , tcs ) )
141+ if ( task != await Task . WhenAny ( task , tcs . Task ) )
142+ throw new OperationCanceledException ( cancellationToken ) ;
143+ return await task ;
144+ }
107145 }
108146}
109147
0 commit comments