Закройте приложение WPF до завершения функции - PullRequest
0 голосов
/ 06 июня 2018

Я новичок в C #, в основном я разработал приложение .net с VB.

Я разработал приложение .net WPF для подключения службы Microsoft Cognitive для получения описания изображения и сохранения на сервере SQL.

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

приложение может работать правильно, чтобы получить описание изображения и обновить таблицу.

но он немедленно закроется без запуска процесса, если я добавлю функцию закрытия приложения.

Могу ли я узнать, как приложение может дождаться завершения процесса, прежде чем закрыть приложение?

Заранее спасибо.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

using System.IO;
using Microsoft.ProjectOxford.Vision;
using Microsoft.ProjectOxford.Vision.Contract;

using System.Diagnostics;


namespace TagPhotoScheduler
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        Boolean Finished = false;

        public MainWindow()
        {
            InitializeComponent();
            ReadFile();    
            CloseApp();
        }

        public void CloseApp()
        {
            //close application after run
            if (Finished == true)
            {                
                Application.Current.Shutdown();
                //this.Close();
            }
        }

        public void ReadFile()
        {
            DataClassesTagPhotoDataContext dc = new DataClassesTagPhotoDataContext();

            var query = from qPhoto in dc.db_PhotoLibrary_Photos
                        where qPhoto.ML_Processed == false
                        select qPhoto;

            foreach (var q in query)
            {    
                string pFileName = string.Empty;
                string photoURL = string.Empty;

                pFileName = q.PhotoID + "." + q.FileType;

                _status.Text += pFileName + " | ";

                photoURL = "https://example.com/storage/";

                if (q.ProjectID == null || q.ProjectID == 0)
                {
                    GetTag(q.PhotoID, photoURL + pFileName);

                    _status.Text += photoURL + pFileName + " \n";
                }
                else //had projectid
                {                        
                    photoURL +=  q.ProjectID + "/";

                    if (q.AlbumID == null || q.AlbumID == 0)
                    {
                        //photoURL += "/" + q.AlbumID + "/";
                        GetTag(q.PhotoID, photoURL + pFileName);
                        _status.Text += photoURL + pFileName + " \n";

                    }
                    else //albumid
                    {
                        photoURL +=  q.AlbumID + "/";
                        GetTag(q.PhotoID, photoURL + pFileName);
                        _status.Text += photoURL + pFileName + " \n";
                    }                            
                }    
            }
            //Finished = true;
            _status.Text += "\n\nFinished";
        }    

        public async void GetTag(int PhotoID, string URL)
        {
            VisionServiceClient VisionServiceClient = new VisionServiceClient("xxxxxxxxxxxxxxxxxxxx", "https://eastasia.api.cognitive.microsoft.com/vision/v1.0");

            DataClassesTagPhotoDataContext dc = new DataClassesTagPhotoDataContext();

            try
            {

                AnalysisResult analysisResult = await VisionServiceClient.DescribeAsync(URL, 3);

                if (analysisResult.Description != null)
                {    
                    foreach (var tag in analysisResult.Description.Tags)
                    {
                        tags += tag + ", ";

                        string QueryAnalysis = string.Empty;

                        db_PhotoLibrary_Photo_Tag newQ = new db_PhotoLibrary_Photo_Tag();
                        newQ.TagOn = DateTime.Now;
                        newQ.TagBy = 0;
                        newQ.PhotoID = PhotoID;
                        newQ.ML_Tag = true;
                        newQ.TagType = 0;
                        newQ.TagName = tag;
                        dc.db_PhotoLibrary_Photo_Tags.InsertOnSubmit(newQ);
                        dc.SubmitChanges();    

                        db_PhotoLibrary_Photo result = (from p in dc.db_PhotoLibrary_Photos
                                                        where p.PhotoID == PhotoID
                                                        select p).SingleOrDefault();    
                        result.ML_Processed = true;    
                        dc.SubmitChanges();    
                    }    
                    _status.Text = tags;
                }
            }
            catch { }    
        }    
    }    
}

Наконец, я перехожу на консольное приложение, и оно может выполнять мою работу.

1 Ответ

0 голосов
/ 06 июня 2018

Вы можете заключить функцию ReadFile в задачу и использовать продолжение:

        public MainWindow()
        {
            InitializeComponent();
            Task.Run(ReadFile).ContinueWith(CloseApp);    

        }

Вы даже уверены, что это должно быть приложение WPF?Консоль не будет делать эту работу?

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