Skip to content

Commit 5e8a4b4

Browse files
committed
CancellationToken対応
1 parent ba096d4 commit 5e8a4b4

File tree

4 files changed

+101
-37
lines changed

4 files changed

+101
-37
lines changed

Assets/PhotonRx/Plugins/Tasks/PhotonTask.cs

Lines changed: 69 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
#if ( NET_4_6 || NET_STANDARD_2_0)
22
using System;
3+
using System.Threading;
34
using System.Threading.Tasks;
45
using ExitGames.Client.Photon;
56
using 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

Assets/PhotonRx/Plugins/version.txt.meta

Lines changed: 7 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Assets/PhotonRx/Sample/Scripts/LoginTaskSample.cs

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
1-
using PhotonRx;
1+
using System.Threading;
2+
using PhotonRx;
23
using UnityEngine;
3-
#if (NET_4_6)
4+
#if ( NET_4_6 || NET_STANDARD_2_0)
45
using System.Threading.Tasks;
56
#endif
67

@@ -11,12 +12,22 @@ void Start()
1112
LoginAndJoinRoom();
1213
}
1314

14-
#if (NET_4_6)
15+
#if ( NET_4_6 || NET_STANDARD_2_0)
16+
17+
CancellationTokenSource _cancellationTokenSource = CancellationTokenSource.CreateLinkedTokenSource();
18+
19+
private void OnDestroy()
20+
{
21+
_cancellationTokenSource?.Cancel();
22+
_cancellationTokenSource?.Dispose();
23+
}
24+
1525
async void LoginAndJoinRoom()
1626
{
27+
var token = _cancellationTokenSource.Token;
1728
PhotonNetwork.autoJoinLobby = true;
1829

19-
var connect = await PhotonTask.ConnectUsingSettings("v1");
30+
var connect = await PhotonTask.ConnectUsingSettings("v1", token);
2031

2132
// 失敗
2233
if (connect.IsFailure)
@@ -25,14 +36,14 @@ async void LoginAndJoinRoom()
2536
return;
2637
}
2738

28-
var randomJoined = await PhotonTask.JoinRandomRoom();
39+
var randomJoined = await PhotonTask.JoinRandomRoom(token);
2940

3041
//成功なら終わり
3142
if (randomJoined.IsSuccess) return;
3243

3344
Debug.Log("Create Room");
3445

35-
var created = await PhotonTask.JoinOrCreateRoom("test", null, null, null);
46+
var created = await PhotonTask.JoinOrCreateRoom("test", null, null, null, token);
3647

3748
if (created.IsSuccess)
3849
{

Assets/PhotonRx/Triggers.meta

Lines changed: 8 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)