Ton*_*Nam 6 c# abort task-parallel-library cancellation
可能重复:
如何中止/取消TPL任务?
我有一个方法需要一些时间来执行因此我返回结果作为回调.我的方法看起来像:
public static void DoWork( Action<object> onCompleteCallBack)
{
Task.Factory.StartNew( () => {
// Do work
onCompleteCallBack(someResult);
});
}
Run Code Online (Sandbox Code Playgroud)
现在我希望能够在用户不想等待的情况下停止执行该方法.结果这就是我的成果:
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; };
}
Run Code Online (Sandbox Code Playgroud)
什么是更合适的方法来中止方法的执行?
谢谢你的回答.我现在记得取消令牌的事情.令牌难以记住.我想我会用这种方法:
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 );
}
Run Code Online (Sandbox Code Playgroud)
使用你们在这个问题的答案上提出的方法与这种方法相比会更好吗?我更喜欢这种方法.我认为它比取消令牌更容易阅读.
PS.我的Visual Studio放置了很多空间.随意格式化代码:)
CancellationTokenSource tokenSource = new CancellationTokenSource();
Task.Factory.StartNew( () => {
// Do work
onCompleteCallBack(someResult);
}, tokenSource.Token);
private void cancel_Click(object sender, RoutedEventArgs e)
{
tokenSource.Cancel();
}
Run Code Online (Sandbox Code Playgroud)