我正在使用ReportViewer控件和導致我出現問題的自定義打印作業工作流。我的代碼看起來有點像這樣:阻止ForEach直到異步事件完成
ids.ForEach(delegate(Guid? guid)
{
var details = items.Where(e => e.guid == guid);
var ds = new ReportDataSource("Form", details);
ReportViewer.LocalReport.DataSources.Clear();
ReportViewer.LocalReport.DataSources.Add(ds);
ReportViewer.RefreshReport();
});
當RefreshReport()
被稱爲最終它將觸發其事件,正是在這種情況下,我有邏輯排隊打印作業:
if (DisplayPrintDialog) ReportViewer.PrintDialog();
else
{
var document = new PrintDocument(ReportViewer.LocalReport);
document.PrinterSettings = ReportViewer.PrinterSettings;
document.Print();
}
DisplayPrintDialog = false;
問題是ForEach循環在事件觸發之前完成運行,因此我需要一種方法來阻止我的ForEach循環,直到RenderingComplete事件觸發循環的每次傳遞爲止。什麼是這樣做的好方法?
真的嗎?會不會'reset.WaitOne();'阻止UI線程,並將所有東西拖入死鎖? – YK1
此外,您正在重新訂閱新委託給'ReportViewer.RenderingComplete'的foreach非常迭代,這將導致'reset.Set();'被調用超過需要的次數。 – YK1
OP沒有指定這是否是一個UI線程,我不是特別關心它是否阻止UI,他們是那些想要將異步操作轉換爲同步操作的人,而不是我。 :)另外,很好的事件發生,我修正了。 – qJake