あなたが元気であることを願っています。
私はBeginInvokeで奇妙な問題に直面しています、そして私は本当にあなたの助けが必要です!
Reportタイプの複数のインスタンスを含むReportingクラスがあります
Class Reporting : UserControl
{
//Reports are inherited from UserControl
Report _report1;
Report _report2;
Report _report3;
//Instanciate and return the Report corresponding to the passed ID (The report is
//instanciated and created only if it's null)
public Report GetReport(int reportId);
public delegate void GenerateReportAsImageDelegate(int reportId,string path)
//Generate the report and save it as image
public void GenerateReportAsImage(int reportId,string path)
{
if(InvokeRequired)
{
BeginInvoke(new GenerateReportAsImageDelegate(GenerateReportAsImage),new object[]{reportId,path});
}
else
{
//... Generating the report etc..
}
}
....
}
これはフォームに表示されるユーザーコントロールであり、これと同じユーザーコントロールがWindowsサービスからも使用され、毎分レポートを生成(および画像として保存)されます。
毎分レポートを生成するために、私はSystem.Threading.Timerを使用しています。
レポートを生成する私のクラスは、サービスで次のようになります。
class ReportServiceClass
{
Reporting _reportingObject;
System.Threading.Timer _timer;
Public ReportingServiceClass(int reportId)
{
_timer = new Timer(new TimerCallback(this.CreateReport), reportId, 0, 1000)
}
private void CreateReport(Object stateInfo)
{
int reportId = Convert.ToInt32(stateInfo);
//To ensure that the _reportingObject is created on the same thread as the report
if(_reportingObject == null)
_reportingObject = new _reportingObject();
_reportingObject.GenerateReportAsImage(reportId,@"c:\reports\report.PNG")
}
}
ほとんどすべてがうまく機能しています..CreateReportがThreadPoolの他のスレッドで実行されることもあります。したがって、レポートとそのコンポーネント(他のスレッドで作成されたもの)に対していくつかのアクションを実行している場合、InvokeRequiredはtrueに設定され、完全に明白です...しかし、BeginInvokeはアクションを実行しません!レポートが作成されたスレッドがもう存在しないようなものです...
この問題を回避する方法について何かアイデアはありますか?
私がこの問題に直面しているのは今から1週間で、グーグルでスタックオーバーフローしました。しかし、何もありません!
どうもありがとう !