C# 实现具有中止功能的方法
如何实现具有中止功能的方法 假设我有一个网格,当数据加载时,网格开始计算总数,并在其下方的另一个网格上显示它们。我想在加载数据后立即开始计算总数 我尝试使用线程,但出现了一个问题:C# 实现具有中止功能的方法,c#,.net,multithreading,C#,.net,Multithreading,如何实现具有中止功能的方法 假设我有一个网格,当数据加载时,网格开始计算总数,并在其下方的另一个网格上显示它们。我想在加载数据后立即开始计算总数 我尝试使用线程,但出现了一个问题: 当我快速点击Load按钮两次时,第一次线程开始工作,第二次我收到一个错误,说线程正忙 我需要实现一些可以中止并重新启动的方法。单击加载时,创建一个并存储它。将其CancellationToken传递给工作线程,并在计算中定期检查,以便及时中止 再次单击Load时,您可以通过在TokenSource上调用Cancel(
当我快速点击Load按钮两次时,第一次线程开始工作,第二次我收到一个错误,说线程正忙
我需要实现一些可以中止并重新启动的方法。单击加载时,创建一个并存储它。将其
CancellationToken
传递给工作线程,并在计算中定期检查,以便及时中止
再次单击Load时,您可以通过在TokenSource上调用
Cancel()
中止当前线程。单击Load时,创建并存储当前线程。将其CancellationToken
传递给工作线程,并在计算中定期检查,以便及时中止
再次单击Load时,您可以通过在TokenSource上调用
Cancel()
中止当前线程。为此,我确实会使用线程。根据您的.NET framework,您可以从设置IProgress
对象开始,该对象可用于从后台线程池线程提供UI更新。所以首先你可以创造
IProgress<object> progressIndicator =
new Progress<object>(ReportProgress);
现在,要开始工作并提供取消支持,您可以执行以下操作
CancellationTokenSource source = new CancellationTokenSource();
CancellationToken token = source.Token;
Task task = Task.Factory.StartNew(() =>
{
// Do your work here and provide cancellation support.
for (int i = 0; i < someMaxValue; ++i)
{
// Update the UI if required.
progressIndicator.ReportProgress(someObject);
// No check for you cancellation condition...
if (source != null && someCancelCondition)
source.Cancel(); // This will throw a CancellationException().
}
}, token,
TaskCreationOptions.None,
TaskScheduler.Default)
.ContinueWith(ant =>
{
// Here you must handle you exceptions and trap your cancellation.
});
CancellationTokenSource=新的CancellationTokenSource();
CancellationToken=source.token;
Task Task=Task.Factory.StartNew(()=>
{
//在这里完成您的工作并提供取消支持。
for(int i=0;i
{
//在这里,您必须处理您的异常并捕获您的取消。
});
有关更多信息,请参阅
我希望这能有所帮助。为此,我确实会使用线程。根据您的.NET framework,您可以从设置
IProgress
对象开始,该对象可用于从后台线程池线程提供UI更新。所以首先你可以创造
IProgress<object> progressIndicator =
new Progress<object>(ReportProgress);
现在,要开始工作并提供取消支持,您可以执行以下操作
CancellationTokenSource source = new CancellationTokenSource();
CancellationToken token = source.Token;
Task task = Task.Factory.StartNew(() =>
{
// Do your work here and provide cancellation support.
for (int i = 0; i < someMaxValue; ++i)
{
// Update the UI if required.
progressIndicator.ReportProgress(someObject);
// No check for you cancellation condition...
if (source != null && someCancelCondition)
source.Cancel(); // This will throw a CancellationException().
}
}, token,
TaskCreationOptions.None,
TaskScheduler.Default)
.ContinueWith(ant =>
{
// Here you must handle you exceptions and trap your cancellation.
});
CancellationTokenSource=新的CancellationTokenSource();
CancellationToken=source.token;
Task Task=Task.Factory.StartNew(()=>
{
//在这里完成您的工作并提供取消支持。
for(int i=0;i
{
//在这里,您必须处理您的异常并捕获您的取消。
});
有关更多信息,请参阅
我希望这有帮助。你能发布一些代码吗?不要尝试中止,相反,您可以实施合作取消。正如其他人所建议的,您可以使用任务和合作取消。下面是关于这个主题的一个很好的介绍:。具体来说,您可能对的“取消任务”部分感兴趣。您可以发布一些代码吗?不要尝试中止,相反,您可以实施合作取消。正如其他人所建议的,您可以使用任务和合作取消。下面是关于这个主题的一个很好的介绍:。具体来说,您可能对.1的“取消任务”部分感兴趣,因为它指向正确的方向,但它不再称为
中止
它是合作取消+1,因为它指向正确的方向,但它不再称为中止
它是合作取消