저는 Xamarin으로 개발 된 모바일 응용 프로그램을 개발 중이며, 그때마다 응용 프로그램이 충돌하여 다음 예외가 발생합니다."시작된 작업이 완료되지 않았습니다."시작되지 않은 작업에 대한 예외가 발생했습니다.
System.InvalidOperationException 완료된 작업에서 Start가 호출되지 않을 수 있습니다. 명확하게하기 위해
이는 이런 기능의 더 많거나 적은 구조입니다 : 내가 버그를 재현하기 위해 관리 할 수 없습니다
CancellationTokenSource tokenSource;
void Function(bool condition1, bool condition2)
{
if (tokenSource != null)
{
tokenSource.Cancel();
tokenSource.Dispose();
tokenSource = null;
}
Task completionTask = null;
if (condition1)
{
tokenSource = new CancellationTokenSource();
completionTask = new Task(async() =>
{
await Task.Delay(1000);
if (tokenSource != null && !tokenSource.IsCancellationRequested)
{
InvokeOnMainThread(Function2);
}
}, tokenSource.Token);
}
if (condition2)
{
TaskFactory.StartNew(() =>
{
...
}).ContinueWith(() =>
{
if (completionTask != null)
{
completionTask.Start();
}
});
}
else
{
if (completionTask != null)
{
completionTask.Start();
}
}
}
void Function2()
{
if (tokenSource != null)
{
tokenSource.Cancel();
tokenSource.Dispose();
tokenSource = null;
}
}
, 또한 내가 얼마나 확실하지 않다 가능한 한 번만 시작할 수 있으므로 completionTask
이 이미 시작되었습니다. 어떤 이유로 든 Function
이 순차적으로 또는 여러 스레드에 의해 호출 되더라도 completionTask
은 로컬 변수이므로 아무런 문제가 발생하지 않습니다.
원인에 대한 의견이 있으십니까?
작업이 완료되었는지 확인하는 속성 또는 메서드가 있습니다. https://msdn.microsoft.com/en-us/library/system.threading.tasks.task.completedtask(v=vs.110).aspx –
조건 1과 조건 2가 모두 맞으면 시도해 볼 수있는 것처럼 보입니다. completionTask를 두 번 시작합니다. – user6144226
제쳐두고, 일반적인 합의는 [작업 생성자는 사용하지 않아야합니다] (http://blog.stephencleary.com/2014/05/a-tour-of-task-part-1-constructors.html) . –