Nano Hash - криптовалюты, майнинг, программирование

Отмените Parallel.ForEach или используйте асинхронное ожидание

У меня есть это событие:

private void  TextBoxSearchText_TextChanged(object sender, TextChangedEventArgs e)
{
    searchText();
}

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

List<TextList> oSelected;
private void searchText()
{
string strSearchText = TextBoxSearchText.Text;
    oSelected = new List<TextList>();            
    Parallel.ForEach(oTextList, item  =>
    {
        Match myMatch = Regex.Match(item.EnglishText.ToString(), "\\b" + strSearchText.ToString().ToLower() + @"\w*", RegexOptions.IgnoreCase);
        if (!myMatch.Success)
        {
            return;
        }

        oSelected.Add(new TextList
        {
            Id = item.Id,
            EnglishText = item.EnglishText
        });
    });

    ListBoxAllTexts.ItemsSource = oSelected;
}

Можно ли использовать async и aviat для выполнения этой работы? Какой из них лучше подходит для поиска текста почти в 1 миллионе строк текста? Я много читал об асинхронности и ожидании, но не мог понять, как использовать это в своей работе. Спасибо


  • Я обновил свой вопрос, добавив строку strSearchText, чтобы узнать, как реализовать ее в методе searchText() для получения нового текста из текстового поля. Почему я не мог просто создать новую строку в своем методе? 29.07.2014

Ответы:


1

Поскольку ваша работа связана с процессором, вы должны использовать параллельный код для фактического поиска. Однако вы можете обернуть параллельную работу мышлением async/await, используя Task.Run:

private async void TextBoxSearchText_TextChanged(object sender, TextChangedEventArgs e)
{
  ListBoxAllTexts.ItemsSource = await Task.Run(() => searchText(TextBoxSearchText.Text));
}

Это сохранит отзывчивость вашего пользовательского интерфейса.

Для отмены используйте CancellationTokenSource. Кстати, вы не можете обновить List<T> из параллельного цикла, как вы сейчас пытаетесь сделать, потому что List<T> не является потокобезопасным. В этом сценарии я рекомендую вместо этого использовать PLINQ:

private CancellationTokenSource _cts;
private async void TextBoxSearchText_TextChanged(object sender, TextChangedEventArgs e)
{
  if (_cts != null)
    _cts.Cancel();
  _cts = new CancellationTokenSource();
  var strSearchText = TextBoxSearchText.Text;
  ListBoxAllTexts.ItemsSource = await Task.Run(
      () => searchText(strSearchText, _cts.Token));
}

private List<TextList> searchText(string strSearchText, CancellationToken token)
{
  try
  {
    return oTextList.AsParallel().WithCancellation(token)
        .Where(item => Regex.IsMatch(item.EnglishText.ToString(), "\\b" + strSearchText.ToLower() + @"\w*", RegexOptions.IgnoreCase))
        .Select(item => new TextList
        {
          Id = item.Id,
          EnglishText = item.EnglishText
        })
        .ToList();
  }
  catch (OperationCanceledException)
  {
    return null;
  }
}

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

29.07.2014
  • Спасибо. Я внес некоторые изменения в вопрос, пожалуйста, проверьте. 29.07.2014
  • Обновлено, чтобы добавить string strSearchText в качестве параметра метода. 29.07.2014
  • Добавление параметра метода приводит к этой ошибке: Player.MainWindow.searchText(string, System.Threading.CancellationToken)': не все пути кода возвращают значение 29.07.2014
  • @MajidPureftekhari: исправлено. Возможно, вы захотите приобрести книгу по C#. 29.07.2014
  • ОШИБКА: в mscorlib.dll произошло необработанное исключение типа «System.InvalidOperationException». Дополнительная информация: вызывающий поток не может получить доступ к этому объекту, поскольку им владеет другой поток. в событии изменения текста TextBox 29.07.2014
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..