Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 实现具有中止功能的方法_C#_.net_Multithreading - Fatal编程技术网

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,因为它指向正确的方向,但它不再称为
中止
它是合作取消