2016-04-27 18 views
1

私の機能には3つの部分があります。 ApartmentState.STAがオンになって非同期タスクを使用してレポートビューアを作成する方法

パート1つのパラメータポップアップ

パート2は、新しいスレッドでコードを実行します。

パート3 - ショーレポートビューアー

私は現在)(このエラーにreport.Showでthe calling thread cannot access this object because a different thread owns it.

public async void AnticipatedEntriesReport(bool fund) 
{ 
    var anticipatedReport = new AnticipatedReport(fund); 
    ReportPreviewForm report = new ReportPreviewForm(); 
    anticipatedReport.InitializeParameters(); 
    if (anticipatedReport.GetParameters() != null) 
    { 
     await RunAsyncTask(
      () => 
      { 
       report = anticipatedReport.GenerateReport(SelectedLoans); 
      }); 

     report.Show(); 
    } 
} 

私のコードの切断を受けています。

anticipatedReport.GenerateReportはReportPreviewFormを返します。

私は何が間違っているのだろうか?私はオブジェクトを作成した場所に基づいていると思います。

public async Task RunAsyncTask(System.Action action) 
{  
    try 
    { 
     await ThreadManager.StartSTATask(action); 
    } 
    catch (Exception ex) 
    {   

    }   
} 

public static Task StartSTATask(System.Action func) 
{ 
    var tcs = new TaskCompletionSource<object>(); 
    var thread = new Thread(() => 
    { 
     try 
     { 
      func(); 
      tcs.SetResult(null); 
     } 
     catch (Exception e) 
     { 
      tcs.SetException(e); 
     } 
    }); 
    thread.SetApartmentState(ApartmentState.STA); 
    thread.Start(); 
    return tcs.Task; 
} 
+0

なぜすることができますタスクの結果としてレポートを返すだけですか? – shlatchz

+0

'RunAsyncTask'とは何ですか? –

+0

@StephenClearyこんにちは、RunAsyncTaskメソッドを含めるように更新しました。 – Master

答えて

0

ただ、タスクの内部報告書を作成し、タスクの親にそれを返す:

public async Task AnticipatedEntriesReport(bool fund) 
{ 
    var anticipatedReport = new AnticipatedReport(fund); 
    ReportPreviewForm report = null; 
    anticipatedReport.InitializeParameters(); 
    if (anticipatedReport.GetParameters() != null) 
    { 
     // Generate the report inside the task and return it. 
     report = await RunAsyncTask(
      () => 
      { 
       var result = anticipatedReport.GenerateReport(SelectedLoans); 
       return result; 
      }); 
    } 
} 

とRunAsyncTaskで:

public async Task<TResult> RunAsyncTask<TResult>(Func<TResult> function) 
{ 
    TResult result = default(TResult); 
    UpdateBusyUi(true); 
    try 
    { 
     result = await ThreadManager.StartSTATask(function); 
    } 
    catch (Exception ex) 
    { 
     SendException(ex); 
     LoadSucceed = false; 
     Events.PublishOnUIThread(new BackgroundCompletedEvent { Header = BackgroundCompletedEvent.EntityActions.Error, Error = true }); 
    } 
    UpdateBusyUi(false); 
    return result; 
} 

StartSTATask:

Task<TResult> StartSTATask<TResult>(Func<TResult> function) 
{ 
    TaskCompletionSource<TResult> source = new TaskCompletionSource<TResult>(); 
    Thread thread = new Thread(() => 
     { 
      try 
      { 
       source.SetResult(function()); 
      } 
      catch (Exception ex) 
      { 
       source.SetException(ex); 
      } 
     }); 
    thread.SetApartmentState(ApartmentState.STA); 
    thread.Start(); 
    return source.Task; 
} 
+0

同じエラーが表示される "多くのUIコンポーネントがこれを必要とするため、呼び出しスレッドはSTAでなければなりません。今度はreport.show()を実行しません – Master

+0

なぜあなたは 'ApartmentState.STA'でメソッドを実行していますか? – shlatchz

+0

再利用可能なメソッドなので、UIの特定の項目を更新したい場合は、ApartmentState.STAを使用すると..... ..... – Master

関連する問題