Как использовать InvokeRequired, BeginInvoke в классе?

145
21 февраля 2019, 16:20

Сделал приложение, которое собирает данные репозитариев с github.com.
Приложение собирает в отдельные поля таблицы информацию о репозитарии: "краткое описание" и "полное описание" (README.md).
Данные отправляются в БД.

Нашёл переводчик текста.
Взял из него нужные классы.
Подключил переводчик к своему приложению (на сколько хватило опыта). Закомментировал ненужные места (на сколько хватило опыта).

В результате получил проблемы:
- перевод "краткого описания" и "полного описание" (README.md) в базе данных заменён
местами;
- перевод "краткого описания" смещается вниз на одну запись;
- в БД не заносится первая запись (см. скрин);

Отладка показала, что я что-то неправильно "нахимичил" в классе "_TranslateMain.cs ".
А что не так, понять не могу.

Т.е. происходит следующее:
- "краткое описание" отправляем в "_TranslateMain.cs "
- в "txtDesc = result;" возвращается null

GTranslateService.TranslateAsync(
   text,
            lngSrc,
            lngDest,
            textTranslatorUrlKey
            ,(success, result)
            =>
            {
                // SetResult(result);
                // IsBusy(false);
                txtDesc = result;
            });
  • "полное описание" (README.md) отправляем в "_TranslateMain.cs "
  • в "txtDesc = result;" возвращается "краткое описание"

Вопрос
Как устранить проблемы?

Grid_uc.cs

_TranslateMain traslateText_cls;
 private void Grid_uc_Load(object sender, EventArgs e) // при загрузке формы
{
            // Перевод текста
            traslateText_cls = new _TranslateMain(); //             
}
// Присваиваем значение переменным. Заполняем ДатаТабле
// public async void VarAddValue()
public async Task<DataTable> VarAddValue()
{
 for (int i = 1; i <= 5; i++)
    {                
                        // Обращаемся к экземпляру репозитария
                        // var instanceRepo = resultRepo.Items[i];
                        instanceRepo = resultRepo.Items[i];
                        instanceRepoId = instanceRepo.Id;
                        descript = instanceRepo.Description; // описание репозитария краткое (которое под именем находится)                        
                        descrip_translate = traslateText_cls.TranslateText(descript);

                        var readme = await client_cur.Repository.Content.GetReadme(instanceRepoId);
                        var rawText = readme.Content;
                        readme_content = rawText.ToString(); // содержание "readme"                        
                        readme_content_translate = traslateText_cls.TranslateText(readme_content);
    }
}

_TranslateMain.cs

using System.Threading.Tasks;
//
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Windows.Forms;
// 
using AutoResxTranslator;
namespace rsh.Core.Translate
{
    class _TranslateMain
    {        
        public string txtDesc; // текст переведённый

        private readonly Dictionary<string, string> _languages = new Dictionary<string, string>
        {
                {"auto", "(Detect)"},
                {"af", "Afrikaans"},
                {"sq", "Albanian"},
                {"ar", "Arabic"},
                {"hy", "Armenian"},
                {"az", "Azerbaijani"},
                {"eu", "Basque"},
                {"be", "Belarusian"},
                {"bn", "Bengali"},
                {"bg", "Bulgarian"},
                {"ca", "Catalan"},
                {"zh-CN", "Chinese (Simplified)"},
                {"zh-TW", "Chinese (Traditional)"},
                {"hr", "Croatian"},
                {"cs", "Czech"},
                {"da", "Danish"},
                {"nl", "Dutch"},
                {"en", "English"},
                {"eo", "Esperanto"},
                {"et", "Estonian"},
                {"tl", "Filipino"},
                {"fi", "Finnish"},
                {"fr", "French"},
                {"gl", "Galician"},
                {"ka", "Georgian"},
                {"de", "German"},
                {"el", "Greek"},
                {"gu", "Gujarati"},
                {"ht", "Haitian Creole"},
                {"iw", "Hebrew"},
                {"hi", "Hindi"},
                {"hu", "Hungarian"},
                {"is", "Icelandic"},
                {"id", "Indonesian"},
                {"ga", "Irish"},
                {"it", "Italian"},
                {"ja", "Japanese"},
                {"kn", "Kannada"},
                {"km", "Khmer"},
                {"ko", "Korean"},
                {"lo", "Lao"},
                {"la", "Latin"},
                {"lv", "Latvian"},
                {"lt", "Lithuanian"},
                {"mk", "Macedonian"},
                {"ms", "Malay"},
                {"mt", "Maltese"},
                {"no", "Norwegian"},
                {"fa", "Persian"},
                {"pl", "Polish"},
                {"pt", "Portuguese"},
                {"ro", "Romanian"},
                {"ru", "Russian"},
                {"sr", "Serbian"},
                {"sk", "Slovak"},
                {"sl", "Slovenian"},
                {"es", "Spanish"},
                {"sw", "Swahili"},
                {"sv", "Swedish"},
                {"ta", "Tamil"},
                {"te", "Telugu"},
                {"th", "Thai"},
                {"tr", "Turkish"},
                {"uk", "Ukrainian"},
                {"ur", "Urdu"},
                {"vi", "Vietnamese"},
                {"cy", "Welsh"},
                {"yi", "Yiddish"}
        };
        void FillComboBoxes()
        {
            //cmbSrc.DisplayMember = "Value";
            //cmbSrc.ValueMember = "Key";
            //cmbDesc.DisplayMember = "Value";
            //cmbDesc.ValueMember = "Key";
            // lstResxLanguages.Items.Clear();
            //foreach (var k in _languages)
            //{
            //    cmbSrc.Items.Add(k);
            //    if (k.Key == "auto")
            //        continue;
            //    cmbDesc.Items.Add(k);
            //    // cmbSourceResxLng.Items.Add(k);
            //    // lstResxLanguages.Items.Add(k.Key, k.Value, -1);
            //}
            // cmbSrc.SelectedIndex = 0;
            // cmbDesc.Text = "English";
            // 
            // srcLang = "auto";
            // descLang = "Russian";
        }

        public string TranslateText(string text_str)
        {
            string lngSrc_str = "auto";
            string lngDest_str = "ru";
            // string text_str = textBox1.Text;
            var lngSrc = lngSrc_str; // язык "КОТОРЫЙ" нужно перевести 
            var lngDest = lngDest_str;  // язык "НА КОТОРЫЙ" нужно перевести
            var text = text_str; // текст для перевода
            // There is no longer a key to validate
            // Нет больше ключа для проверки
            var textTranslatorUrlKey = "";
            // IsBusy(true);
            GTranslateService.TranslateAsync(
                text,
                lngSrc,
                lngDest,
                textTranslatorUrlKey
                ,(success, result)
                =>
                {
                    // SetResult(result);
                    // IsBusy(false);
                    txtDesc = result;
                });
            return txtDesc;
        }
        void IsBusy(bool isbusy)
        {
            //if (this.InvokeRequired)
            //{
            //    this.BeginInvoke(new Action<bool>(IsBusy), isbusy);
            //    return;
            //}
            //else
            //{
            //    // tabMain.Enabled = !isbusy;
            //}
        }

        public void SetResult(string result)
        {
            #region MyRegion
            //// if (InvokeRequired)
            //// if (this.InvokeRequired)
            //{
            //    // this.BeginInvoke(new Action<string>(SetResult), result);
            //    // BeginInvoke(new Action<string>(SetResult), result);
            //    return;
            //}
            //else
            //{
            //    txtDesc = result; // переведённый текст
            //}
            #endregion
        }

    }
}

GTranslateService.cs

using System;
using System.Collections.Generic;
using System.IO;
using System.Net;
using System.Text;
using System.Web;
namespace AutoResxTranslator
{
    public class GTranslateService
    {
        private const string RequestUserAgent = "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:55.0) Gecko/20100101 Firefox/55.0";
        private const string RequestGoogleTranslatorUrl = "https://translate.googleapis.com/translate_a/single?client=gtx&sl={0}&tl={1}&hl=en&dt=t&dt=bd&dj=1&source=icon&tk=467103.467103&q={2}";

        public delegate void TranslateCallBack(bool succeed, string result);
        public static void TranslateAsync(
            string text,
            string sourceLng,
            string destLng,
            string textTranslatorUrlKey,
            TranslateCallBack callBack)
        {
            var request = CreateWebRequest(text, sourceLng, destLng, textTranslatorUrlKey);
            request.BeginGetResponse(
                TranslateRequestCallBack,
                new KeyValuePair<WebRequest, TranslateCallBack>(request, callBack));
        }
        public static bool Translate(
            string text,
            string sourceLng,
            string destLng,
            string textTranslatorUrlKey,
            out string result)
        {
            var request = CreateWebRequest(text, sourceLng, destLng, textTranslatorUrlKey);
            try
            {
                var response = (HttpWebResponse)request.GetResponse();
                if (response.StatusCode != HttpStatusCode.OK)
                {
                    result = "Response is failed with code: " + response.StatusCode;
                    return false;
                }
                using (var stream = response.GetResponseStream())
                {
                    string output;
                    var succeed = ReadGoogleTranslatedResult(stream, out output);
                    result = output;
                    return succeed;
                }
            }
            catch (Exception ex)
            {
                result = ex.Message;
                return false;
            }
        }
        static WebRequest CreateWebRequest(
            string text,
            string lngSourceCode,
            string lngDestinationCode,
            string textTranslatorUrlKey)
        {
            text = HttpUtility.UrlEncode(text);
            var url = string.Format(RequestGoogleTranslatorUrl, lngSourceCode, lngDestinationCode, text);

            var create = (HttpWebRequest)WebRequest.Create(url);
            create.UserAgent = RequestUserAgent;
            create.Timeout = 50 * 1000;
            return create;
        }
        private static void TranslateRequestCallBack(IAsyncResult ar)
        {
            var pair = (KeyValuePair<WebRequest, TranslateCallBack>)ar.AsyncState;
            var request = pair.Key;
            var callback = pair.Value;
            HttpWebResponse response = null;
            try
            {
                response = (HttpWebResponse)request.EndGetResponse(ar);
                if (response.StatusCode != HttpStatusCode.OK)
                {
                    callback(false, "Response is failed with code: " + response.StatusCode);
                    return;
                }
                using (var stream = response.GetResponseStream())
                {
                    string output;
                    var succeed = ReadGoogleTranslatedResult(stream, out output);
                    callback(succeed, output);
                }
            }
            catch (Exception ex)
            {
                callback(false, "Request failed.\r\n" + ex.Message);
            }
            finally
            {
                if (response != null)
                {
                    response.Close();
                }
            }
        }
        /// <summary>
        ///  the main trick :)
        /// </summary>
        static bool ReadGoogleTranslatedResult(Stream rawdata, out string result)
        {
            string text;
            using (var reader = new StreamReader(rawdata, Encoding.UTF8))
            {
                text = reader.ReadToEnd();
            }
            try
            {
                dynamic obj = SimpleJson.DeserializeObject(text);
                var final = "";
                // the number of lines
                int lines = obj[0].Count;
                for (int i = 0; i < lines; i++)
                {
                    // the translated text.
                    final += (obj[0][i][0]).ToString();
                }
                result = final;
                return true;
            }
            catch (Exception ex)
            {
                result = ex.Message;
                return false;
            }
        }
    }

Добавление записей в БД

public void InsertRecordInDb(
            string full_name_repo
            ,string descrip
            ,string descrip_translate
            ,string Readme
            ,string Readme_traslate
            ,string html_url
            //,string full_name_repo
            //,string full_name_repo
            )
        {
            using (OleDbConnection cn = new OleDbConnection())
            {
                connection = new OleDbConnection(connectionString);
                connection.Open();
                string sql = string.Format("Insert Into " + table +
                       "(full_name_repo, descrip, descrip_translate, Readme, Readme_traslate, html_url) " +
                       "Values(@full_name_repo, @descrip, @descrip_translate, @Readme, @Readme_traslate, @html_url)");
                using (OleDbCommand cmd = new OleDbCommand(sql, this.connection))
                {
                    // Добавить параметры
                    cmd.Parameters.AddWithValue("@full_name_repo", full_name_repo);
                    cmd.Parameters.AddWithValue("@descrip", descrip);
                    cmd.Parameters.AddWithValue("@descrip_translate", descrip_translate);
                    cmd.Parameters.AddWithValue("@Readme", Readme);
                    cmd.Parameters.AddWithValue("@Readme_traslate", Readme_traslate);
                    cmd.Parameters.AddWithValue("@html_url", html_url);
                    cmd.ExecuteNonQuery();
                }

            }
        }

READ ALSO
Позиционирование текста в ToolStripMenuItem

Позиционирование текста в ToolStripMenuItem

Я задал первому елементу меню висоту 60 и textalign = MiddleCenter Но елемент просто игнорит свойство

149
Обработка нескольких IndexOutOfRangeException

Обработка нескольких IndexOutOfRangeException

Ситуация: В методе происходит парсинг данных:

173
C# работа с созданным cmd процессом

C# работа с созданным cmd процессом

Всем привет ! В питоне есть такая штука как subprocess и создавая его можно заставить программу писать в консоль и читать результат из консолиТ...

170
Unity BoxCollider - растянуть по размеру предмета

Unity BoxCollider - растянуть по размеру предмета

Когда добавляешь BoxCollider к новому предмету, он автоматически растягивается под его размерыКогда меняешь меш этого предмета - коллайдер не подтягивается...

173