2

バックグラウンド:

Outlook アドインで単純な進行状況ダイアログを使用して、長い操作を実行している間に進行状況を表示しています。別のスレッドで Outlook オブジェクトを使用するコードを実行できないため、従来のバックグラウンド ワーカー プロセスを実装することはできません。私のアドインは、Outlook 2013 まで正常に動作していましたが、進行状況ダイアログがハングする場合がありました。アドインを VS デバッガーで実行してハングを引き起こし、ブレークすると、プログレスバーを強制的に更新しようとする DoEvents() 行で停止しているように見えます。

私の質問:

上記の制限で進行状況を表示するためのより良いシステムを提案できますか (長時間実行されるコードは、メインの Outlook スレッドで実行する必要があります)。DoEvents() を使用せずに進行状況ダイアログを応答させるより良い方法はありますか?

次の簡単なコードは、現在これをどのように行っているかを示しています。Outlook オブジェクトに対して長い操作を実行しているアドイン コード:

private void longRunningProcess()
{
    int max = 100;

    DlgStatus dlgstatus = new DlgStatus();
    dlgstatus.ProgressMax = max;
    dlgstatus.Show();

    for (int i = 0; i < max; i++)
    {
        //Execute long running code that MUST best run in the main (Outlook's) thread of execution...
        System.Threading.Thread.Sleep(1000); //for simulation purposes

        if (dlgstatus.Cancelled) break;
        dlgstatus.SetProgress("Processing item: " + i.ToString(), i);
    }
}

簡単な進行状況ダイアログ ウィンドウのコードは次のとおりです。

public partial class DlgStatus : Form
{
    private bool _cancelled;

    public DlgStatus()
    {
        InitializeComponent();
    }

    public int ProgressMax
    {
        set 
        {
            progress.Maximum = value;
            Application.DoEvents();
        }
    }

    public bool Cancelled
    {
        get { return _cancelled; }
    }

    public void SetProgress(string status, int val)
    {
        lblStatus.Text = status;
        progress.Value = val;
        Application.DoEvents();  //Seems to hang here
    }

    private void btnCancel_Click(object sender, EventArgs e)
    {
        _cancelled = true;
        Application.DoEvents();
        this.Visible = false;
    }
}
4

1 に答える 1