надеюсь, ты в порядке.
У меня возникла любопытная проблема с BeginInvoke, и мне действительно нужна ваша помощь!
У меня есть класс Reporting, который содержит несколько экземпляров типа Report
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 не выполняет никаких действий! Это похоже на то, что поток, в котором был создан отчет, больше не существует ...
У вас, ребята, есть идеи, как избежать этой проблемы?
Прошла неделя, когда я столкнулся с этой проблемой, я погуглил и переполнился стеком. но ничего!
Большое спасибо!