2017-11-10 5 views
0

問題があります。私はデータベースからデータを取り出し、このデータをtxtファイルに生成するアプリケーションを持っています。最初に私はこのデータをtxtファイルに生成するためのボタンを作成しますが、今私はこのアプリケーションをtxtファイルに生成する必要があります。例えば、5分ごとに、ボタンなしで前のファイルを上書きします。ここに私のコードは次のとおりです。5分ごとにtxtファイルを生成するC#wpf

public partial class MainWindow : Window 
{ 
    private static Timer aTimer; 

    private List<tw__Towar> someData; 

    public MainWindow() 
    { 
     InitializeComponent(); 
    } 

    private void Generate() 
    { 

     string path = @"c:\some path"; 


     var createFile = someData.Select(k => $"{k.tw_Id}\t" + $"{k.column}\t" + $"{k.column2}\t" + $"{k.column3}\t" 
     ); 
     File.WriteAllLines(path, createFile); 
     Process.Start(path); 

     System.Timers.Timer aTimer = new System.Timers.Timer(); 
     aTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent); 
     aTimer.Interval = some time; 
     aTimer.Enabled = true; 
    } 

    private void OnTimedEvent(object sender, ElapsedEventArgs e) 
    { 
     Generate(); 
     Console.WriteLine("It works"); 
    } 

    private void LoadData() 
    { 

     DataClasses1DataContext cd = new DataClasses1DataContext(); 
     someData = (from p in cd.datavbase where p.column != null && p.column != "" 
        select p).ToList(); 
     GT1.ItemsSource = someData; 
    } 

    private void Button_Click(object sender, RoutedEventArgs e) 
    { 
     LoadData(); 
    } 

    //private void Button_Click_1(object sender, RoutedEventArgs e) 
    //{ 
    // Generate(); 
    //} 
} 
+2

問題は何ですか?あなたの質問を更新してください。 –

+0

問題が機能していないアプリケーションが作成したパスにtxtファイルを生成しない – manhart

+3

タイマーをどこで開始しているのかわかりません...あなたの問題です。 'Generate'メソッドの中でタイマーを初期化すべきではありません。なぜなら、タイマーだけを再起動すべきだからです。 – Ben

答えて

1

これは私があなたのロジックが動作するように期待する方法である:

(タイマーは、それがファイルを書き込む前に経過する必要があるので、最初のファイルが5生成されていることを心に留めておきます分のウィンドウが開いた後)DispatcherTimer詳細は

public partial class MainWindow : Window 
{ 
    //the timer doesn't need to be static 
    //and since we are going to update the UI when the timer elapses, 
    //(in LoadData) 
    //we should use a dispatchertimer 

    private DispatcherTimer aTimer; 

    private List<tw__Towar> someData; 

    public MainWindow() 
    { 
     InitializeComponent(); 

     //set up the timer straight away 
     aTimer = new DispatcherTimer(); 
     aTimer.Tick += new EventHandler(OnTimedEvent); 
     aTimer.Interval = TimeSpan.FromSeconds(300); //300 seconds = 5 minutes 
     aTimer.Start(); 
    } 

    private void Generate() 
    { 
     LoadData(); 

     string path = @"c:\some path"; 

     var createFile = someData.Select(k => $"{k.tw_Id}\t" + $"{k.column}\t" + $"{k.column2}\t" + $"{k.column3}\t" 
     ); 
     File.WriteAllLines(path, createFile); 
     Process.Start(path); 
    } 

    private void OnTimedEvent(object sender, EventArgs e) 
    { 
     Generate(); 
     Console.WriteLine("It works"); 
    } 

    private void LoadData() 
    { 
     DataClasses1DataContext cd = new DataClasses1DataContext(); 
     someData = (from p in cd.datavbase where p.column != null && p.column != "" select p).ToList(); 
     GT1.ItemsSource = someData; 

    } 
} 

https://msdn.microsoft.com/en-us/library/system.windows.threading.dispatchertimer.aspx

と理由WHのためを参照してくださいy私たちはDispatcherTimerが必要です。Refresh UI with a Timer in WPF (with BackgroundWorker?)

また、Jon Skeetもそうだと言いました。

+1

私はこのようなエラーがあります。私はすべてがうまくいくとは思っていません。aTimer.Tick + = new ElapsedEventHandler(OnTimedEvent);エラーがあります:implicityがタイプ 'System.Timers.ElapsedEventHandler'を 'System.EventHandler'に変換することはできません。 – manhart

+0

okありがとうございました。 – manhart

+1

@manhartこれがあなたのお手伝いをしてくれたら、答えを受け入れて、その人に報酬を与えるようにしてください。 – XAMlMAX

関連する問題