1

C# でのスレッド化に頭を悩ませようとしていますが、この動作の実装に苦労しています。

DialogResult.No30 秒が経過すると返される単純な yes/no ダイアログが必要です。

私がこれまでに持っているのはこれです:

Thread th = new Thread(() =>
{
    try
    {
        result = message.ShowDialog();
    }
    catch (Exception)
    {

    }
});
th.Start();
Thread.Sleep(30000);
th.Abort();

ダイアログで [はい] または [いいえ] を選択しても、30 秒間待機します。応答を受信したときにスレッドを停止する必要があります。

これはおそらく簡単なことですが、私はC#に比較的慣れていないため、これについていくつかの助けを借りることができます.

4

2 に答える 2

3

フォームを初期化するときにタイマーを使用できます。タイマーが切れたら、フォームを閉じます。

Timer time1 = new Timer();
time1.Elapsed += new ElapsedEventHandler(OnTimedEvent);
time1.Interval = 30000; // 30 secs
...
time1.Enabled = true; // Start the timer
message.ShowDialog();

private void OnTimedEvent(object source, ElapsedEventArgs e)
{
    // Close your Form
    message.Close();
    // Maybe you could set a variable, that indicates you, that the timer timed out

}

于 2012-12-11T11:19:55.727 に答える
0

と を上書きする必要がShowDialog()ありますShowDialog(owner)。ショー ダイアログが呼び出されたら、タイマーを開始して に転送しますbase.ShowDialog()。タイマーが tick イベントを発生させたら、単に を呼び出しますClose()

ここに実装例があります:

public partial class FormTimed : Form
{
    private String _OriginalText;
    private DateTime _StartTime;
    private Timer _Timer;

    public FormTimed()
    {
        InitializeComponent();
        InitializeTimer();

        Duration = TimeSpan.FromSeconds(10);
    }

    [DefaultValue(typeof(TimeSpan), "00:00:10")]
    public TimeSpan Duration { get; set; }

    public override string Text
    {
        get
        {
            return _OriginalText;
        }
        set
        {
            _OriginalText = value;
            base.Text = value;
        }
    }

    public void DisableTimer()
    {
        _Timer.Stop();
        base.Text = _OriginalText;
    }

    public void ResetTimer()
    {
        _StartTime = DateTime.UtcNow;
        _Timer.Start();
    }

    public new DialogResult ShowDialog()
    {
        StartTimer();
        return base.ShowDialog();
    }

    public new DialogResult ShowDialog(IWin32Window owner)
    {
        StartTimer();
        return base.ShowDialog(owner);
    }

    private void InitializeTimer()
    {
        _Timer = new Timer();
        _Timer.Interval = 100;
        _Timer.Tick += OnTimerTick;
    }

    private void OnTimerTick(object sender, EventArgs e)
    {
        var finishTime = _StartTime + Duration;
        var remainingDuration = finishTime - DateTime.UtcNow;

        if (remainingDuration < TimeSpan.Zero)
        {
            Close();
        }

        base.Text = _OriginalText + " (" + (int)remainingDuration.TotalSeconds + ")";
    }

    private void StartTimer()
    {
        _StartTime = DateTime.UtcNow;
        _Timer.Start();
    }
}
于 2012-12-11T11:21:34.500 に答える