Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches

◆ Wait() [4/6]

bool System.Threading.ManualResetEventSlim.Wait ( int millisecondsTimeout,
CancellationToken cancellationToken )
inlineinherited

Definition at line 211 of file ManualResetEventSlim.cs.

212 {
214 cancellationToken.ThrowIfCancellationRequested();
215 if (millisecondsTimeout < -1)
216 {
217 throw new ArgumentOutOfRangeException("millisecondsTimeout");
218 }
219 if (!IsSet)
220 {
221 if (millisecondsTimeout == 0)
222 {
223 return false;
224 }
225 uint startTime = 0u;
226 bool flag = false;
227 int num = millisecondsTimeout;
228 if (millisecondsTimeout != -1)
229 {
230 startTime = TimeoutHelper.GetTime();
231 flag = true;
232 }
233 int spinCount = SpinCount;
234 SpinWait spinWait = default(SpinWait);
235 while (spinWait.Count < spinCount)
236 {
237 spinWait.SpinOnce(-1);
238 if (IsSet)
239 {
240 return true;
241 }
242 if (spinWait.Count >= 100 && spinWait.Count % 10 == 0)
243 {
244 cancellationToken.ThrowIfCancellationRequested();
245 }
246 }
248 using (cancellationToken.UnsafeRegister(s_cancellationTokenCallback, this))
249 {
250 lock (m_lock)
251 {
252 while (!IsSet)
253 {
254 cancellationToken.ThrowIfCancellationRequested();
255 if (flag)
256 {
257 num = TimeoutHelper.UpdateTimeOut(startTime, millisecondsTimeout);
258 if (num <= 0)
259 {
260 return false;
261 }
262 }
263 Waiters++;
264 if (IsSet)
265 {
266 Waiters--;
267 return true;
268 }
269 try
270 {
271 if (!Monitor.Wait(m_lock, num))
272 {
273 return false;
274 }
275 }
276 finally
277 {
278 Waiters--;
279 }
280 }
281 }
282 }
283 }
284 return true;
285 }
static readonly Action< object > s_cancellationTokenCallback

References System.cancellationToken, System.Threading.SpinWait.Count, System.Threading.ManualResetEventSlim.EnsureLockObjectCreated(), System.Threading.TimeoutHelper.GetTime(), System.Threading.ManualResetEventSlim.IsSet, System.Threading.ManualResetEventSlim.m_lock, System.millisecondsTimeout, System.Threading.ManualResetEventSlim.s_cancellationTokenCallback, System.Threading.ManualResetEventSlim.SpinCount, System.Threading.SpinWait.SpinOnce(), System.Threading.ManualResetEventSlim.ThrowIfDisposed(), System.Threading.TimeoutHelper.UpdateTimeOut(), System.Threading.Monitor.Wait(), and System.Threading.ManualResetEventSlim.Waiters.