3

ReportViewerでいくつかの問題が発生しています。基本的にコードは次のとおりです。

public void Display(object dataSource, ReportViewer viewer)
    {
        currentDs = dataSource as MyTypes;

        if (currentDs != null)
        {
            var param = new LinkedList<ReportParameter>();
            param.AddFirst(new ReportParameter("Title", "Title"));
            viewer.ProcessingMode = ProcessingMode.Local;
            viewer.LocalReport.ReportEmbeddedResource = ReportName;
            viewer.LocalReport.EnableExternalImages = true;
            viewer.LocalReport.DataSources.Add(new ReportDataSource(DataSourceName + "_Header", currentDs.Header));
            viewer.LocalReport.DataSources.Add(new ReportDataSource(DataSourceName + "_Footer", currentDs.Footer));
            viewer.LocalReport.DataSources.Add(new ReportDataSource(DataSourceName + "_Lines", currentDs.Lines));

            viewer.LocalReport.SetParameters(param);
            viewer.RefreshReport();
        }
    }

問題は、rdlcレポートを生成することもあれば、アプリケーションをハングさせるだけのこともあります。具体的には、viewer.RefreshReport();にとどまります。永遠に。

対応するパラメータとデータセットは、rdlcファイルに正しく設定されています。

誰かが同様の行動を経験したことがありますか?

前もって感謝します。

4

4 に答える 4

3

ビューアが正しく設定されていると思います。

通常、初回世代は成功しますか?viewer.Reset()レポートが生成されるたびに電話をかけてみると、複雑な問題が解決する可能性があります。

于 2013-03-22T16:18:18.853 に答える
3

2006年からの投稿がありますが、表面上は関連性があり、回避策を提供する可能性がありますが、発生している問題を再現することはほとんど不可能であるため、自分でこれを行っていないことを認めなければなりません。したがって、回避策で修正できるかどうかを確認することも同様に不可能です。理想的ではありませんが、役に立たない情報などがないことを願っています:-)

関連情報はリンクされたスレッドの下部にあり、わかりやすくするために、以下に引用しました。

ReportViewerコントロールは、レポートオブジェクト(.ServerReportおよび.LocalReportとして公開)とUI(実際のReportViewerクラス)の2つのコンポーネントに分割されています。レポートオブジェクトには、レポートに関するすべての状態が格納されます。UIコンポーネントは、レポート、パラメータープロンプト、ツールバーなどを表示するために必要な情報を取得するために、それらを呼び出すだけです。

UIコンポーネントは、ほとんどのコントロールと同様に、スレッドセーフではありません。ただし、レポートオブジェクトはスレッドセーフです。RefreshReportを呼び出すと、ビューアはバックグラウンドスレッドを使用してレポートオブジェクトのRenderを呼び出します。ただし、コントロールがレポートオブジェクトを呼び出すのはこれだけではありません。初めてレポート定義(ローカルレポート)をコンパイルしたり、セッション(サーバーレポート)を作成したりする必要がある場合は、時間がかかることがあります。この「初回」がRefreshReport中の場合、バックグラウンドスレッドで発生します。しかし、あなたが見てきたように、それは他の時に起こる可能性があります。たとえば、パラメータUIにデータを入力するには、GetParametersを呼び出す必要があります。これには、この起動時のペナルティも必要です。

この「初回」のペナルティがバックグラウンドスレッドにあることを保証する場合は、レポートパスおよびその他の接続/データソース情報を設定した後、バックグラウンドスレッドからGetParametersを呼び出します。

ReportViewerこれは、UIスレッドからではなく、常にバックグラウンドスレッドから呼び出しを行うことを示唆しているようです。これにより、遅延がUIに影響を与えることはありません。でも、ちょっとつまらないデザインのように聞こえます!

これはあなたに何か助けになりますか?

于 2013-03-27T07:40:43.780 に答える
1

私はそれを修正したかもしれません。このページは私がそれを理解するのを助けました:http://ikriv.com/dev/dotnet/MysteriousHang.html

したがって、a)レポートビューアはUIスレッドで作成する必要があり、b)常に確実に行われるとは限らないようです(詳細についてはリンクを参照してください)。レポートビューアは.NET2コンポーネントであり、リンクに記載されている動作は.NET2に適用されます。

それを修正するために、私は次のトリックを採用しました:

  • 最初のトリック:起動時にUIスレッドに名前を付ける
  • 2番目のトリック:早い段階でハンドルを強制し、同期コンテキストへの参照を取得します
  • 3番目のトリック:スレッド名と同期コンテキストを使用して、invoke required->invokeidiomを実行します。

すべてがうまくいったら、戻ってきて詳細を投稿します。

于 2013-04-18T23:28:05.940 に答える
0

.Net4.0およびReportViewer2010を使用するWindowsXPで問題が発生しました。はい、OSはサポートを終了しますが、Windows Embedded POSReady 2009(Windows XP SP3)は、2019年4月まで拡張サポートされます。

ハングを回避するには、非推奨のAPIを呼び出してレポートをレンダリングします

rptviewer.LocalReport.ExecuteReportInSandboxAppDomain();

レポートを終了または再実行する場合、たとえばレポートのパラメータが変更された場合、レポートは次の方法で適切にクリーンアップする必要があります。

rptviewer.LocalReport.DataSources.Clear();
rptviewer.LocalReport.ReportEmbeddedResource = null;
rptviewer.LocalReport.Dispose();
// release sandbox is required to prevent the lock up, see below note on display report
rptviewer.LocalReport.ReleaseSandboxAppDomain();

// clean up report viewer
rptviewer.Clear();
rptviewer.Reset();

Windows 7、8、8.1、および10に関する注意。ハングの問題は発生しません。

于 2017-05-19T05:27:23.707 に答える