async/awaitを用いたSleep代替処理

2017-01-04

System.Threading.Thread.Sleep() を用いてSleep処理を行うと、アプリケーションがフリーズしてしまう。

別スレッドを作成し、Joinで終了を待つことで回避することもできるが、制約が多い。

        // using System.Threading;

        protected override void main()
        {
            Thread objThread = new Thread(new ParameterizedThreadStart(ThredSleep));
            objThread.Start(5000);
            objThread.Join();

            MessageBox.Show("OK");
        }

        /// <summary>
        /// 待機処理
        /// </summary>
        /// <param name="millisecondsTimeout">
        /// スリープするミリ秒
        ///  ParameterizedThreadStartの制約上、object型である必要がある。
        /// </param>
        private void ThredSleep(object millisecondsTimeout)
        {
            Thread.Sleep((int)millisecondsTimeout);

async/awaitを用いてSleep処理を行うこと下記のようになる。

        protected override async void main()
        {
            await AsyncSleep(5000);

            MessageBox.Show("OK");
        }

        /// <summary>
        /// 待機処理
        /// </summary>
        /// <param name="millisecondsTimeout">スリープするミリ秒</param>
        private async Task AsyncSleep(int millisecondsTimeout)
        {
            await Task.Delay(millisecondsTimeout);
        }