90494


LINQのOrderByのソート処理をキャンセルするにはどうしたら良いのでしょうか。

**目的**  
運用では、自前の文字列比較クラスを使って数万単位の文字列をソートすることがあるのですが、これに数秒の時間がかかっており、この処理を中断したいときがあります。

**試したこと**  
CompareメソッドでCancellationTokenを使ってOperationCancelExceptionをthrowするようにしてみたのですが、VisualStudioのデバッガーにユーザー処理されていない例外として中断されてしまい、かつソート外部にはInvalidOperationExceptionの例外として投げられてしまいます。
(VS2022 .NET6.0)

以下、テスト用のサンプルコードになります。

[code]

    var items = Enumerable.Range(0, 100).Reverse().ToList();
    
    // このソート処理を CancellationToken でキャンセルしたい
    var sorted = items.OrderBy(e => e, new HeavyComparar()).ToList();
    
    public class HeavyComparar : IComparer<int>
    {
        public int Compare(int x, int y)
        {
            Thread.Sleep(1);  // heavy compare process dummy
            return x.CompareTo(y);
        }
    }
    
[/code]


CC BY-SA 4.0
2022-08-10T05:57:41.710
90492
2022-08-10T08:21:34.887
2022-08-10T08:21:34.887
14817
14817
question
c# linq
LINQのOrderBy処理をキャンセルしたい


>
> CompareメソッドでCancellationTokenを使ってOperationCanceledExceptionをthrowするようにしてみたのですが、VisualStudioのデバッガーにユーザー処理されていない例外として中断されてしまい、かつソート外部にはInvalidOperationExceptionの例外として投げられてしまいます。

InnerExceptionに、OperationCanceledException が入ってるんじゃないでしょうか。

[code]

    try
    {
        _CancellationTokenSource.Cancel();
        var sorted = items.OrderBy(e => e, new HeavyComparar()).ToList();
    }
    catch(InvalidOperationException ex)
    {
        if( ex.InnerException is OperationCanceledException )
        {
            Console.WriteLine("キャンセルされました");
        }
    }
    
[/code]


CC BY-SA 4.0
2022-08-10T07:07:17.963
90494
2022-08-10T07:52:06.273
2022-08-10T07:52:06.273
41943
41943
90492
answer