Возможный дубликат:
Как мне прервать/ отменить задачи TPL?
У меня есть метод, выполнение которого занимает некоторое время, поэтому я возвращаю результат как обратный вызов. Мой метод выглядит так:
public static void DoWork( Action<object> onCompleteCallBack)
{
Task.Factory.StartNew( () => {
// Do work
onCompleteCallBack(someResult);
});
}
Теперь я хотел бы иметь возможность остановить выполнение этого метода, если пользователь не хочет ждать. В результате вот что у меня получилось:
static void Main ( string[] args )
{
var cancelMethod = DoWork( x =>
{
// method completed
Console.Write( x.ToString() );
});
Thread.Sleep( 5000 ); // some time passes
// then user decides to abort method
cancelMethod();
Console.Read();
}
static Action DoWork ( Action<object> onCompleteCallBack )
{
bool stopExecuting = false;
Task.Factory.StartNew( () =>
{
for ( var i = 0 ; i < 100000 ; i++ )
{
Thread.Sleep( 1 );
if ( stopExecuting )
{
onCompleteCallBack( "Method aborted!" );
return;
}
}
onCompleteCallBack( "Method completed successfully" );
} );
return () => { stopExecuting = true; };
}
Какой будет более подходящий способ прервать выполнение метода?
Редактировать
Спасибо за ваши ответы. Теперь я вспомнил о жетоне отмены. Токен трудно запомнить. Я думаю, что я буду использовать этот подход:
static void Main ( string[ ] args )
{
Action abortTask;
DoWork( methodCompleted, out abortTask );
Thread.Sleep( 5000 ); // some time passes then user decides to abort method
// cancel execution of method
abortTask( );
Console.Read( );
}
static void methodCompleted ( object msg )
{
Console.Write( msg.ToString( ) );
}
static void DoWork ( Action<object> onCompleteCallBack, out Action abortThisTask )
{
bool stopExecuting = false;
abortThisTask = ( ) => { stopExecuting = true; };
Task.Factory.StartNew( ( ) =>
{
for ( var i = 0 ; i < 100000 ; i++ )
{
Thread.Sleep( 1 );
if ( stopExecuting )
{
onCompleteCallBack( "Method aborted!" );
return;
}
}
onCompleteCallBack( "Method completed successfully" );
} );
}
// Overloaded method
static void DoWork ( Action<object> onCompleteCallBack )
{
Action abortTask;
DoWork( onCompleteCallBack ,out abortTask );
}
Будет ли лучше использовать подходы, которые вы, ребята, предложили в ответах на этот вопрос, по сравнению с этим подходом. Такой подход мне нравится больше. Я думаю, что его легче читать, чем токен отмены.
PS. В моей Visual Studio много места. Не стесняйтесь форматировать код :)