Ber*_*ryl 2 c# parallel-processing unit-testing task-parallel-library async-await
很大程度上作为这个问题的后续测试驱动异步任务我已经提出了一些代码,如果我没有任务等待,但如果我这样做就失败了.
有谁能解释为什么?
例外:
我得到这个错误,当代码击中实用类在他的博客写的斯蒂芬·克利里的构造这里
public ProgressReporter()
{
_scheduler = TaskScheduler.FromCurrentSynchronizationContext();
}
Test 'Smack.Core.Presentation.Tests.Threading.ProgressReporterTests.OnSuccessFullComplete_ExpectedResultIsReturned_JustWait' failed:
System.AggregateException : One or more errors occurred.
----> System.InvalidOperationException : The current SynchronizationContext may not be used as a TaskScheduler.
at System.Threading.Tasks.Task.ThrowIfExceptional(Boolean includeTaskCanceledExceptions)
at System.Threading.Tasks.Task.Wait(Int32 millisecondsTimeout, CancellationToken cancellationToken)
at System.Threading.Tasks.Task.Wait()
Threading\ProgressReporterTests.cs(142,0): at Smack.Core.Presentation.Tests.Threading.ProgressReporterTests.OnSuccessFullComplete_ExpectedResultIsReturned_JustWait()
--InvalidOperationException
at System.Threading.Tasks.SynchronizationContextTaskScheduler..ctor()
at System.Threading.Tasks.TaskScheduler.FromCurrentSynchronizationContext()
Threading\ProgressReporter.cs(24,0): at Smack.Core.Lib.Threading.ProgressReporter..ctor()
Threading\ProgressReporterTests.cs(52,0): at Smack.Core.Presentation.Tests.Threading.ProgressReporterTests._startBackgroundTask(Boolean causeError)
Threading\ProgressReporterTests.cs(141,0): at Smack.Core.Presentation.Tests.Threading.ProgressReporterTests.<OnSuccessFullComplete_ExpectedResultIsReturned_JustWait>b__a()
at System.Threading.Tasks.Task.InnerInvoke()
at System.Threading.Tasks.Task.Execute()
Run Code Online (Sandbox Code Playgroud)
测试(NUnit w/TestDriven.Net runner):
private class MockSynchContext : SynchronizationContext{}
[Test]
public void OnSuccessFullComplete_ExpectedResultIsReturned_Wait()
{
var mc = new MockSynchContext();
SynchronizationContext.SetSynchronizationContext(mc);
Assert.That(SynchronizationContext.Current, Is.EqualTo(mc));
Assert.DoesNotThrow(() => TaskScheduler.FromCurrentSynchronizationContext());
var task = Task.Factory.StartNew(() => _startBackgroundTask(false));
task.Wait(2000);
_actualResult = 42;
}
Run Code Online (Sandbox Code Playgroud)
SuT:
private void _startBackgroundTask(bool causeError)
{
_cancellationTokenSource = new CancellationTokenSource();
var cancellationToken = _cancellationTokenSource.Token;
_progressReporter = new ProgressReporter();
var task = Task.Factory.StartNew(() =>
{
for (var i = 0; i != 100; ++i) {
// Check for cancellation
cancellationToken.ThrowIfCancellationRequested();
Thread.Sleep(30); // Do some work.
// Report progress of the work.
_progressReporter.ReportProgress(
() =>
{
// Note: code passed to "ReportProgress" can access UI elements freely.
_currentProgress = i;
});
}
// After all that work, cause the error if requested.
if (causeError) {
throw new InvalidOperationException("Oops...");
}
// The answer, at last!
return 42;
},
cancellationToken);
// ProgressReporter can be used to report successful completion,
// cancelation, or failure to the UI thread.
_progressReporter.RegisterContinuation(task, () =>
{
// Update UI to reflect completion.
_currentProgress = 100;
// Display results.
if (task.Exception != null)
_actualErrorMessage = task.Exception.ToString();
else if (task.IsCanceled)
_wasCancelled = true;
else
_actualResult = task.Result;
// Reset UI.
_whenCompleted();
});
}
Run Code Online (Sandbox Code Playgroud)
需要明确的是:如果我评论出任务.等等,该测试实际上是成功的.这是为什么?
加分:
我知道这在技术上是另一个问题,但重复所有这些似乎是一种耻辱,所以:
为什么我的MockSynchContext在我的测试中没有在TaskScheduler.FromCurrentSynchronizationContext()上抛出异常但是在第二个任务中做了什么?更重要的是,有没有办法传递上下文,以便我可以正确地进行测试?
"如果我评论出任务.等等,那个测试确实成功了.为什么会这样?"
在您实际检查任务之前,任务不会报告任务本身发生的异常(通过"等待","值","处置"等).然后它重新抛出异常.在真实的应用程序中,GC最终会到达任务并导致您的应用程序崩溃.
| 归档时间: |
|
| 查看次数: |
13327 次 |
| 最近记录: |