Tutup C # / C ++ DLLImport atau setidaknya hapus alokasi memori heapnya? [Tutup]

Jan 15 2021

Saya memiliki aplikasi C # .NET Framework yang memanggil C ++ DLL yang tidak dikelola melalui DLLImport, untuk mengurai sekumpulan file yang diberikan oleh pengguna dan melakukan beberapa operasi.

Saya ingin memiliki bilah kemajuan pada aplikasi C # saya, karena penguraian file ini mungkin memakan waktu lama. Cara terbaik yang saya pikirkan untuk melakukan ini adalah dengan mengurai beberapa file sekaligus, dan kemudian kembali ke kode C # sehingga saya dapat memperbarui bilah kemajuan.

Namun, ini mengharuskan saya untuk mengalokasikan beberapa memori di heap DLL C ++ jadi saya tidak harus meneruskan semua 10.000+ jalur file sebagai argumen setiap kali saya harus memanggil fungsi C ++ lagi.

Saya tidak yakin apakah menutup DLL setelah saya menyelesaikan penguraian saya dapat dilakukan. Apakah ada cara lain untuk menyelesaikan tugas ini tanpa harus menyimpan semua jalur dalam memori yang dialokasikan untuk keseluruhan waktu saat aplikasi berjalan?

Jawaban

3 RomanPolunin Jan 15 2021 at 05:35

Karena Anda telah mengonfirmasi bahwa file itu independen, Anda harus mencoba memparalelkan operasi.

Di sisi produsen proses, siapkan Daftar atau larik dengan nama file. Jika daftarnya terlalu besar (sungguh, BENAR-BENAR besar sehingga menekan RAM yang tersedia), Anda mungkin ingin menggantinya dengan kombinasi BlockingCollection dan Queue, sehingga produsen dapat dibatasi hingga jumlah item dalam pipa pemrosesan di bawah ambang batas .

Di sisi lain pipa ini, mulai pekerja (sebaris atau sebagai utas pekerja terpisah) yang akan membaca item secara berurutan atau .AsParallel () dari koleksi, dan meneruskannya ke pustaka yang tidak dikelola untuk diproses.

Karena ini adalah aplikasi UI, saya kira utas pekerja Anda harus terpisah. Setelah setiap file yang diproses, lakukan .Invoke () pada formulir UI untuk memperbarui bilah kemajuan.