mirror of https://github.com/Cysharp/UniTask
Compare commits
4 Commits
55bc644563
...
0c0a742bbf
Author | SHA1 | Date |
---|---|---|
|
0c0a742bbf | |
|
22940635fe | |
|
c1042b32b7 | |
|
29a144694d |
|
@ -42,7 +42,6 @@ namespace Cysharp.Threading.Tasks
|
|||
while (h != null)
|
||||
{
|
||||
iteratingNode = h;
|
||||
var next = h.Next;
|
||||
|
||||
try
|
||||
{
|
||||
|
@ -54,7 +53,9 @@ namespace Cysharp.Threading.Tasks
|
|||
Remove(h);
|
||||
}
|
||||
|
||||
h = next;
|
||||
// If `h` itself is removed by OnNext, h.Next is null.
|
||||
// Therefore, instead of looking at h.Next, the `iteratingNode` reference itself is replaced.
|
||||
h = h == iteratingNode ? h.Next : iteratingNode;
|
||||
}
|
||||
|
||||
iteratingNode = null;
|
||||
|
@ -86,7 +87,7 @@ namespace Cysharp.Threading.Tasks
|
|||
}
|
||||
|
||||
iteratingNode = null;
|
||||
var next = h.Next;
|
||||
var next = h == iteratingNode ? h.Next : iteratingNode;
|
||||
Remove(h);
|
||||
h = next;
|
||||
}
|
||||
|
@ -119,8 +120,8 @@ namespace Cysharp.Threading.Tasks
|
|||
LogError(ex);
|
||||
}
|
||||
|
||||
var next = h == iteratingNode ? h.Next : iteratingNode;
|
||||
iteratingNode = null;
|
||||
var next = h.Next;
|
||||
Remove(h);
|
||||
h = next;
|
||||
}
|
||||
|
@ -153,8 +154,8 @@ namespace Cysharp.Threading.Tasks
|
|||
LogError(ex);
|
||||
}
|
||||
|
||||
var next = h == iteratingNode ? h.Next : iteratingNode;
|
||||
iteratingNode = null;
|
||||
var next = h.Next;
|
||||
Remove(h);
|
||||
h = next;
|
||||
}
|
||||
|
@ -238,18 +239,20 @@ namespace Cysharp.Threading.Tasks
|
|||
{
|
||||
head = next;
|
||||
}
|
||||
else if (handler == iteratingHead)
|
||||
// when handler is head, prev indicate last so don't use it.
|
||||
else if (prev != null)
|
||||
{
|
||||
prev.Next = next;
|
||||
}
|
||||
|
||||
if (handler == iteratingNode)
|
||||
{
|
||||
iteratingNode = next;
|
||||
}
|
||||
if (handler == iteratingHead)
|
||||
{
|
||||
iteratingHead = next;
|
||||
}
|
||||
else
|
||||
{
|
||||
// when handler is head, prev indicate last so don't use it.
|
||||
if (prev != null)
|
||||
{
|
||||
prev.Next = next;
|
||||
}
|
||||
}
|
||||
|
||||
if (head != null)
|
||||
{
|
||||
|
|
|
@ -1,63 +0,0 @@
|
|||
using Cysharp.Threading.Tasks;
|
||||
using FluentAssertions;
|
||||
using System;
|
||||
using System.Collections;
|
||||
using System.Threading;
|
||||
using UnityEngine.TestTools;
|
||||
|
||||
namespace Cysharp.Threading.TasksTests
|
||||
{
|
||||
public class AsyncReactivePropertyTest
|
||||
{
|
||||
private int _callCounter;
|
||||
|
||||
[UnityTest]
|
||||
public IEnumerator WaitCancelWait() => UniTask.ToCoroutine(async () =>
|
||||
{
|
||||
// Test case for https://github.com/Cysharp/UniTask/issues/444
|
||||
|
||||
var property = new AsyncReactiveProperty<int>(0);
|
||||
|
||||
var cts1 = new CancellationTokenSource();
|
||||
var cts2 = new CancellationTokenSource();
|
||||
WaitForProperty(property, cts1.Token);
|
||||
WaitForProperty(property, cts2.Token);
|
||||
|
||||
_callCounter = 0;
|
||||
property.Value = 1;
|
||||
_callCounter.Should().Be(2);
|
||||
|
||||
cts2.Cancel();
|
||||
cts2.Dispose();
|
||||
cts1.Cancel();
|
||||
cts1.Dispose();
|
||||
|
||||
var cts3 = new CancellationTokenSource();
|
||||
WaitForProperty(property, cts3.Token);
|
||||
|
||||
_callCounter = 0;
|
||||
property.Value = 2;
|
||||
_callCounter.Should().Be(1);
|
||||
|
||||
cts3.Cancel();
|
||||
cts3.Dispose();
|
||||
await UniTask.CompletedTask;
|
||||
});
|
||||
|
||||
private async void WaitForProperty(AsyncReactiveProperty<int> property, CancellationToken token)
|
||||
{
|
||||
while (true)
|
||||
{
|
||||
try
|
||||
{
|
||||
await property.WaitAsync(token);
|
||||
_callCounter++;
|
||||
}
|
||||
catch (OperationCanceledException)
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,3 +0,0 @@
|
|||
fileFormatVersion: 2
|
||||
guid: 27665955eefb4448969b8cc4dd204600
|
||||
timeCreated: 1676129650
|
Loading…
Reference in New Issue