Winform非同期操作によるUIインタフェースの「偽死」防止

1332 ワード

winformプロジェクトを作成し、以下の方法で、非同期で時間のかかる操作を実行し、メインスレッドのブロックを防止し、インタフェースの「偽死」を招くことができます.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

using System.Threading;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            RunAsync(() =>
            {
                for (var i = 0; i < 100000; i++)
                {
                    Thread.Sleep(1000);
                    RunInMainthread(() =>
                        {
                            label1.Text = i.ToString();
                        });
                }
            });
        }

        //     
        public static void RunAsync(Action action)
        {
            ((Action)(delegate()
            {
                action.Invoke();
            })).BeginInvoke(null, null);
        }

        public void RunInMainthread(Action action)
        {
            this.BeginInvoke((Action)(delegate()
            {
                action.Invoke();
            }));
        }

    }
}