

.NETフレームワークは4.0です。  
コンソールアプリケーションで以下のメソッドを実行すると、Convert内のProcess.Startで処理が停止してしまいます(例外の発生ではなく、次に進まなくなる)。  
また、Process.Startでの外部アプリケーションの呼び出しには成功していて、タスクマネージャから確認すると処理も終わっています。  
このメソッドをWindowsFormアプリケーションから呼び出すと、正常に終了します。

[code]

    public CancellationTokenSource ConvertAsync<T>(object obj,string[]　files,Listener listener){
        var cancellation = new CancellationTokenSource();
        var task = new Task(
            ()=>{
                 try{
                    Task convertedTask = null;
                    Action<object> action = new Action<object>((obj) => {
                        try{                                                    
                            listener.oneFile(obj);
                            return;
                        } catch (Exception ex2) {
                            Debug.WriteLine(ex2);
                            return;
                    }});
                    foreach (var file in files) {
    
                        if(cancellation.IsCancellationRequested)return;
                        Debug.WriteLine("before:"+file);
                        var converted =Convert(obj,file);/* <-ここでProcess.Start()呼び出し*/
                        Debug.WriteLine("after:"+converted);
                        if(converted==null)break;
    
                        if(convertedTask==null){
                            convertedTask = new Task(action,ab,cancellation.Token);
                            convertedTask.Start();
                        }else{
                            convertedTask = convertedTask.ContinueWith((arg) => action(converted),cancellation.Token);
                        }
                    }
                    if(convertedTask!=null)convertedTask.Wait();
                    listener.allDone();
                }catch(Exception ex){
                    Debug.WriteLine(ex);
                    return;
                }
    
        },cancellation.Token);
        task.Start();
        return cancellation;
    }
    
[/code]

以上、ご教授いただければ幸いです。よろしくお願いいたします。


CC BY-SA 3.0
2017-09-14T04:12:22.140
37934
2020-01-22T18:02:25.453
25376
question
c# 非同期
コンソールアプリケーションで、別TaskからProcess.Startで処理が止まる


開示していない情報でしたが、コンソールアプリケーション側ではConvertAsyncを呼び出した後、Console.ReadLine()で待機していました。  
しかし、下記のように返り値をTaskに変更し、コンソールアプリケーション側でTask.Wait()で待機した所、正常終了するようになりました。原因は未だに不明です。

[code]

    public Task ConvertAsync<T>(object obj,string[]　files,Listener listener){
        var cancellation = new CancellationTokenSource();
        var task = new Task(
            ()=>{
                 try{
                    Task convertedTask = null;
                    Action<object> action = new Action<object>((obj) => {
                        try{                                                    
                            listener.oneFile(obj);
                            return;
                        } catch (Exception ex2) {
                            Debug.WriteLine(ex2);
                            return;
                    }});
                    foreach (var file in files) {
    
                        if(cancellation.IsCancellationRequested)return;
                        Debug.WriteLine("before:"+file);
                        var converted =Convert(obj,file);/* <-ここでProcess.Start()呼び出し*/
                        Debug.WriteLine("after:"+converted);
                        if(converted==null)break;
    
                        if(convertedTask==null){
                            convertedTask = new Task(action,converted,cancellation.Token);
                            convertedTask.Start();
                        }else{
                            convertedTask = convertedTask.ContinueWith((arg) => action(converted),cancellation.Token);
                        }
                    }
                    if(convertedTask!=null)convertedTask.Wait();
                    listener.allDone();
                }catch(Exception ex){
                    Debug.WriteLine(ex);
                    return;
                }
    
        },cancellation.Token);
        task.Start();
        return task;
    }
    
[/code]


CC BY-SA 3.0
2017-09-15T03:31:54.680
37956
2017-09-15T03:31:54.680
25376
37934
answer