Apa yang dilakukan kode ini adalah mengulang datagrid dari pemeriksaan URL di html untuk string tertentu dan mengembalikan data yang sesuai, sejauh ini sangat mendasar.

Saya mencoba memahami metode menunggu/async dengan lebih baik, sejauh ini saya memiliki pemahaman yang cukup baik tetapi saya telah menemukan hambatan, kode yang saya miliki sejauh ini:

FormMain.cs

        public async Task RunAsyncAnalyzer()
        {
            try
            {
                BtnPerformLinkAnalysis.Enabled = false;
                if (DataGridViewLinks.Rows.Count > 0)
                {
                    foreach (DataGridViewRow row in DataGridViewLinks.Rows)
                    {
                        row.Cells[2].Value = await Task.Run(() => { Helpers.GetLinkPlatformType(row.Cells[0].Value.ToString()); });
                    }
                }
                BtnPerformLinkAnalysis.Enabled = true;
            }
            catch (Exception ex)
            {
                Helpers.DebugLogging("[" + DateTime.Now + "]-[" + ex.ToString() + "]");
            }

        }

        private async void BtnPerformLinkAnalysis_Click(object sender, EventArgs e)
        {
            await RunAsyncAnalyzer();
        }

Helpers.cs

        public static string GetLinkPlatformType(string url) {
            string platform_type = "......";
            try { 
                var html = GetWebPageHTML(url);

                if (html.Contains("Start the discussion…")) {
                    platform_type = "DISCUZ|CAN_COMMENT";
                }
            }
            catch (Exception ex)
            {
                Helpers.DebugLogging("[" + DateTime.Now + "]-[" + ex.ToString() + "]");
            }
            return platform_type;
        }

Kesalahan yang saya dapatkan adalah: cannot convert type 'void' to 'object' dan ada di baris ini: row.Cells[2].Value = await Task.Run(() => { Helpers.GetLinkPlatformType(row.Cells[0].Value.ToString()); });

Ia juga mengatakan di atasnya: Awaited Task returns no value tetapi metode GetLinkPlatformType mengembalikan nilai itu bukan void saya tidak dapat melihat apa masalahnya adalah saya tahu saya sedang mencari sesuatu tetapi saya tidak sepenuhnya yakin apa, bantuan apa pun ke arah yang benar akan dihargai.

2
graham23s 29 Mei 2020, 11:34

1 menjawab

Jawaban Terbaik

Masalahnya adalah tugas Anda tidak mengembalikan apa pun, Anda melewatkan return.

row.Cells[2].Value = await Task.Run(() => { return Helpers.GetLinkPlatformType(row.Cells[0].Value.ToString()); });

Kalau tidak, itu hanya tugas yang melakukan sesuatu tetapi tidak mengembalikan apa pun.

Juga, seperti yang disebutkan @leszek dalam komentar, inilah pendekatan lain:

row.Cells[2].Value = await Task.Run(() => Helpers.GetLinkPlatformType(row.Cells[0].Value.ToString()) );

Semoga membantu!

5
devcrp 29 Mei 2020, 08:43