Как создать диспетчер WPF в службе Windows

#wpf #service #.net-5

#wpf #Обслуживание #.net-5

Вопрос:

У нас есть служба Windows, и частью работы службы Windows является отправка электронных писем. Наши приложения позволяют пользователям сохранять фильтрацию в сетке (сторонней) и присваивать ей имя представления. Затем имя представления можно использовать в задаче, которая создает сетку, загружает фильтрацию для представления данных, а затем получает выражение строкового фильтра из сетки. Затем выражение строкового фильтра передается в DynamicLinq и используется в операторе Linq «Where» для получения данных в том виде, в каком их будет видеть пользователь. Проблема с этим подходом заключается в том, что требуется WPF, чтобы позволить коду создавать сетку, фильтровать и отправлять электронную почту.

Используя эту ссылку, мы попытались запустить задачи. Он работает в обычном приложении WPF, но не при запуске из нашей службы Windows. Это наш код задачи (Код 1):

 public class OurTask
{
    public void RunTask ()
    {
        // Do some setup

       Action createGridAction =
                ( Action )
                (
                    () =>
                    {
                         // create grid, load view, get filter expression
                         // get filtered data
                    }
                );

            // create a thread
            var newWindowThread = new Thread ( new ThreadStart ( () =>
            {
                // create our context, and install it:
                SynchronizationContext.SetSynchronizationContext (
                    new DispatcherSynchronizationContext (
                        Dispatcher.CurrentDispatcher ) );

                LogProvider.Logger.LogInfo ( "RunTask Call CreateGrid" );

                createGridAction ();

                LogProvider.Logger.LogInfo ( "RunTask Called CreateGrid" );
            } ) );

            // use data to create email with data view and send email

    }

}
 

У нас также есть подобный код в нескольких местах (Код 2).:

        Action notifyAction =
                ( Action )
                (
                    () =>
                    {
                       // do something
                    }
                );  

            if ( System.Windows.Application.Current != null amp;amp; 
                 System.Windows.Application.Current.Dispatcher.Thread != Thread.CurrentThread )
                System.Windows.Application.Current.Dispatcher.Invoke ( notifyAction, 
                    System.Windows.Threading.DispatcherPriority.DataBind );
            else
               notifyAction ();
 

Мы хотим настроить диспетчер, который будет запускать код 1, но мы также хотели бы
установите диспетчер приложений так, чтобы код 2 работал. Как мы можем хотя бы запустить код 1
и в идеале настроить диспетчер приложений так, чтобы запускался код 2?

Обновление воспользовалось советом @BionicCode и создало сервер-клиент, который не имеет пользовательского интерфейса и обрабатывает код для grid. Спасибо

Комментарии:

1. Классы WPF предназначены для настольных приложений, а не для каких-либо приложений-служб (приложений-служб Windows или веб-приложений IIS). Почему для отправки электронных писем требуются классы WPF?

2. Пожалуйста, прочитайте первый абзац вопроса. В нем изложено, почему мы это делаем. Обычно я бы тоже этого не делал, но мы делаем это с помощью grid для получения выражения строкового фильтра, которое преобразуется в предикат с помощью dynamic linq.

3. «Проблема с этим подходом заключается в том, что требуется, чтобы WPF позволял коду создавать сетку, фильтровать и отправлять электронную почту». Вы уже справились с этим. Ваша проблема в том, что ваша служба делает слишком много. Служба не имеет пользовательского интерфейса. Служба выполняется в фоновом режиме. Служба использует другую потоковую модель и не поддерживает потоки пользовательского интерфейса (потоки диспетчера), то же самое относится и к консольному приложению. Служба взаимодействует с другими службами или клиентами, но не с пользователями. Вам нужен клиент (вашей службы), который имеет пользовательский интерфейс и позволяет взаимодействовать с пользователем. Этот клиент может быть настольным клиентом.