kzen.dev
  • Pertanyaan
  • Tag
  • Pengguna
Notifikasi
Imbalan
Registrasi
Setelah Anda mendaftar, Anda akan diberitahu tentang balasan dan komentar untuk pertanyaan Anda.
Gabung
Jika Anda sudah memiliki akun, masuk untuk memeriksa pemberitahuan baru.
Akan ada hadiah untuk pertanyaan, jawaban, dan komentar tambahan.
Lebih
Sumber
Sunting
 sczdavos
sczdavos
Question

C# memanggil form.show() dari thread lain

jika saya memanggil form.show() pada objek WinForms dari thread lain, form akan melempar pengecualian. Apakah ada cara lain untuk menambahkan form baru yang dapat dilihat ke thread aplikasi utama? Jika tidak, bagaimana saya bisa membuka form tanpa menghentikan thread yang sedang saya jalankan?

Berikut adalah contoh kode saya. Saya mencoba untuk memulai sebuah thread dan kemudian mengeksekusi beberapa pekerjaan di dalam thread tersebut. Saat pekerjaan berlangsung, saya akan menampilkan formulir.

public void Main()
{
    new Thread(new ThreadStart(showForm)).Start();
    // Rest of main thread goes here...
}

public void showForm() 
{
    // Do some work here.
    myForm form = new myForm();
    form.Text = "my text";
    form.Show();
    // Do some more work here
}
19 2012-08-16T21:09:14+00:00 3
Ted Spence
Ted Spence
Pertanyaan edit 16 Agustus 2012 в 10:07
Pemrograman
.net-3.5
winforms
multithreading
c#
Solution / Answer
Ted Spence
Ted Spence
16 Agustus 2012 в 9:16
2012-08-16T21:16:55+00:00
Lebih
Sumber
Sunting
#16973466

Coba gunakan panggilan invoke:

public static Form globalForm;

void Main()
{
    globalForm = new Form();
    globalForm.Show();
    globalForm.Hide();
    // Spawn threads here
}

void ThreadProc()
{
    myForm form = new myForm();
    globalForm.Invoke((MethodInvoker)delegate() {
        form.Text = "my text";
        form.Show();
    });
}

Panggilan "invoke" memberitahu formulir "Tolong jalankan kode ini di thread Anda daripada thread saya." Anda kemudian dapat membuat perubahan pada UI WinForms dari dalam delegasi.

Dokumentasi lebih lanjut tentang Invoke ada di sini: http://msdn.microsoft.com/en-us/library/zyzhdc6b.aspx

EDIT: Anda perlu menggunakan objek WinForms yang sudah ada untuk memanggil invoke. Saya telah menunjukkan di sini bagaimana Anda dapat membuat objek global; jika tidak, jika Anda memiliki objek windows lainnya, itu juga akan berfungsi.

Ted Spence
Ted Spence
Jawaban edit 16 Agustus 2012 в 9:47
33
0
Hiroshi Maekawa
Hiroshi Maekawa
12 April 2013 в 12:29
2013-04-12T00:29:40+00:00
Lebih
Sumber
Sunting
#16973467

Anda harus memanggil Application.Run() setelah anda memanggil form.Show(). Sebagai contoh:

public void showForm() 
{
    // Do some work here.
    myForm form = new myForm();
    form.Text = "my text";
    form.Show();
    Application.Run();
    // Do some more work here
}

Adapun rincian di balik alasannya, posting msdn ini dapat membantu.

Grant  - REINSTATE MONICA
Grant - REINSTATE MONICA
Jawaban edit 12 April 2013 в 1:47
13
0
Mohamad Taheri
Mohamad Taheri
30 Juli 2018 в 7:19
2018-07-30T19:19:57+00:00
Lebih
Sumber
Sunting
#16973468

Cara terbaik menurut pengalaman saya:

var ac = (ReportPre)Application.OpenForms["ReportPre"];
Thread shower = new Thread(new ThreadStart(() =>
    {
        if (ac == null)
        {                
            this.Invoke((MethodInvoker)delegate () {
                ac = new ReportPre();
                ac.Show();
            });       
        }
        else
        {
            this.Invoke((MethodInvoker)delegate
            {
                pictureBox1.Visible = true;
            });
            if (ac.InvokeRequired)
            {
                ac.Invoke(new MethodInvoker(delegate {
                    ac.Hide();
                    ac.Show();
                }));                          
            }
        }
    }));
shower.Start();
Alexander I.
Alexander I.
Jawaban edit 30 Juli 2018 в 8:20
0
0
Tambahkan pertanyaan
Kategori
Semua
Teknologi
Budaya / Rekreasi
Kehidupan / Seni
Ilmu Pengetahuan
Profesional
Bisnis
Pengguna
Semua
Baru
Populer
1
Daniel Gogov
Terdaftar 2 hari yang lalu
2
工藤 芳則
Terdaftar 1 minggu yang lalu
3
Ирина Беляева
Terdaftar 1 minggu yang lalu
4
Darya Arsenyeva
Terdaftar 2 minggu yang lalu
5
anyta nuam-nuam (LapuSiK)
Terdaftar 2 minggu yang lalu
ID
JA
KO
© kzen.dev 2023
Sumber
stackoverflow.com
di bawah lisensi cc by-sa 3.0 dengan atribusi