Pertanyaan CLR tidak dapat melakukan transisi dari konteks COM […] selama 60 detik


Saya mendapatkan kesalahan ini pada kode yang digunakan untuk bekerja. Saya belum mengubah kodenya.

Berikut ini kesalahan lengkapnya:

CLR tidak dapat melakukan transisi dari COM konteks 0x3322d98 ke COM konteks 0x3322f08 selama 60 detik. Benang yang memiliki konteks tujuan / apartemen kemungkinan besar melakukan menunggu non-pemompaan atau memproses operasi berjalan sangat panjang tanpa memompa pesan Windows. Situasi ini umumnya memiliki dampak kinerja negatif dan bahkan dapat menyebabkan aplikasi menjadi tidak responsif atau penggunaan memori terus-menerus berakumulasi dari waktu ke waktu. Untuk menghindari masalah ini, semua thread single threaded apartment (STA) harus menggunakan primitif tunggu pemompaan (seperti CoWaitForMultipleHandles) dan secara rutin memompa pesan selama operasi yang berjalan lama.

Dan inilah kode yang menyebabkannya:

var openFileDialog1 = new System.Windows.Forms.OpenFileDialog();
openFileDialog1.DefaultExt = "mdb";
openFileDialog1.Filter = "Management Database (manage.mdb)|manage.mdb";

//Stalls indefinitely on the following line, then gives the CLR error
//one minute later.  The dialog never opens.
if(openFileDialog1.ShowDialog() == DialogResult.OK)
{
    ....
}

Ya, saya yakin dialog tidak terbuka di latar belakang, dan tidak, saya tidak memiliki kode COM eksplisit atau unmanaged marshalling atau multithreading.

Saya tidak tahu mengapa OpenFileDialog tidak terbuka - ada ide?


32
2018-04-30 21:52


asal


Jawaban:


Figur it out - secara otomatis membawa Anda ke lokasi terakhir yang Anda lihat setiap kali dialog terbuka. Jika lokasi itu adalah lokasi jaringan yang tidak ada lagi (mis. Komputer lain mati), itu hanya akan bertahan selamanya.

Solusi saya terlihat seperti ini:

string initialDirectory = ...; //Figure out an initial directory from somewhere
openFileDialog1.InitialDirectory = !Directory.Exists(initialDirectory)
                                       ? Path.GetPathRoot(Environment.SystemDirectory)
                                       : initialDirectory;

11
2018-05-14 15:07



Jadi, ini mengeluh tentang konteks COM meskipun Anda tidak secara eksplisit menggunakan COM karena membuka dialog shell asli di bawah semua kode c # yang indah, dan shell tidak menggunakan COM.

Apa yang dikatakan pesan ini kepada Anda adalah apa pun yang coba dilakukan, itu melakukannya di utas UI dan tidak dengan cara yang baik, dan itu tampaknya memakan waktu lama. Jelas apa pun yang salah bukanlah kesalahan Anda, jadi Anda dapat mengabaikan sebagian besar saran yang diberikannya kepada Anda.

Hal-hal yang perlu dicoba:

  1. Pertama saya akan mencoba, sebagai AaronLS sarankan, menyederhanakan Anda openFileDialog sebanyak mungkin. Cobalah tidak mengatur apa pun; buat saja orang baru dan telepon ShowDialog(). Jika itu menyelesaikan masalah, maka Anda baru saja memberinya parameter yang salah, dan kita dapat membicarakan implikasinya. Namun jika itu tidak berhasil, itu berarti ada sesuatu yang salah di tanah shell.

  2. Salah satu alasan yang mungkin ini mungkin terjadi adalah karena Anda memiliki ekstensi shell terinstal yang melakukan sesuatu yang buruk. Hal terbaik untuk Anda lakukan adalah break-in (ctrl+break in Visual Studio Saya pikir, atau debug->break all di bilah menu) dan dapatkan tumpukan lengkap untuk kami. Kita harus dapat mengidentifikasi pelakunya dengan melihat siapa yang ada di tumpukan ketika dialog muncul.


9
2018-04-30 22:20



Satu perbaikan untuk masalah ini adalah pergi ke Debug -> Pengecualian -> menu Managed Debug Assistants di Visual Studio dan hapus centang pada ContextSwitchDeadlock

Dari http://blog.wpfwonderland.com/2007/08/16/clr-has-been-unable-to-transition-from-com-context-for-60-seconds/

Memperbarui: Tolong, jangan downvote, jika Anda cukup berpikir, solusi itu adalah ide yang buruk. Sejumlah orang mencoba sejumlah solusi yang tercantum sebagai jawaban di sini, tetapi solusi saya adalah satu-satunya yang membantu mereka. Itu sebabnya jawabannya masih memiliki nilai positif.


6
2017-11-27 14:36



Saya mendapat masalah ini saat bekerja dengan database besar dan itu membuat UI membeku untuk waktu yang lama. Jadi saya memasukkan kode-kode ke dalam BackgroundWorker dan sekarang masalahnya hilang. terima kasih kepada @i_am_jorf

Apa pesan ini memberitahu Anda adalah apa pun yang coba dilakukan,   itu melakukannya pada utas UI dan bukan dengan cara yang bagus, dan itu sepertinya   membutuhkan waktu lama.

private void btnConvert_Click(object sender, EventArgs e)
{
  Cursor = Cursors.WaitCursor;
  bgwConvert.RunWorkerAsync();
}

private void bgwConvert_DoWork(object sender, DoWorkEventArgs e)
{
  //My taking-lots-of-time codes
}

private void bgwConvert_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
  Cursor = Cursors.Default;
  MessageBox.Show("Done");
}

5
2017-10-18 09:24



Saya juga memiliki masalah ini, dan saya memecahkannya dengan mengubah. Bersih saya kerangka ke yang terbaru (. Net framework 4.5 dalam kasus saya; dari properti proyek Window-> Debug-> .Net Framework), dan mengubah jenis CPU dari x86 untuk Setiap CPU (dalam properti proyek Window-> Build-> Platform Target).


2
2017-11-30 14:51



Saya baru saja mengalami masalah yang sama beberapa saat yang lalu, solusi dalam kasus saya sederhana: Bersihkan solusinya dan membangunnya kembali!

Saya menggunakan Visual Studio 2015.

Semoga yang satu ini membantu.


0
2018-03-23 17:54