gpt4 book ai didi

c# - 取消执行方法的正确方法

转载 作者:太空狗 更新时间:2023-10-29 21:34:53 25 4
gpt4 key购买 nike

<分区>

Possible Duplicate:
How do I abort/cancel TPL Tasks?

我有一个方法需要一些时间来执行,因此我将结果作为回调返回。我的方法如下:

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; };
}

什么是中止方法执行的更合适的方式?

编辑

感谢您的回答。我现在记得关于取消 token 的事情。 token 的东西很难记住。我想我会使用这种方法:

    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 );
}

使用你们在回答这个问题时建议的方法与使用这种方法会更好吗?我更喜欢这种方法。我认为它比取消标记更容易阅读。

附言。我的 Visual Studio 放置了很多空间。随意格式化代码:)

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com