2017-11-10 13 views
0

문제가 있습니다. 데이터베이스에서 데이터를 가져 와서이 데이터를 txt 파일로 생성하는 앱이 있습니다. 처음에는이 데이터를 txt 파일로 생성하기위한 버튼을 만들었지 만 이제는이 애플리케이션에서 txt 파일에 5 분마다 데이터를 생성하고 버튼없이 이전 파일을 덮어 쓰고 싶습니다. 첫 번째 파일은 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

이 내가 당신의 논리가 작동하는 기대하는 방법입니다 : 여기 내 코드입니다 윈도우 분 후 참조 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 y 우리는 DispatcherTimer이 필요합니다. Refresh UI with a Timer in WPF (with BackgroundWorker?)

또한 Jon Skeet이 말했듯이 사실이어야합니다.

+1

나는 다음과 같은 에러를 가지고있다. 나는 괜찮다고 생각하는 모든 것을 어떻게해야할지 모른다. 라인 aTimer.Tick + = new ElapsedEventHandler (OnTimedEvent); 오류가 있습니다 : 함축적으로 'System.Timers.ElapsedEventHandler'형식을 'System.EventHandler'로 변환 할 수 없습니다. – manhart

+0

ok 도움을 주셔서 감사합니다. – manhart

+1

@manhart 이것이 당신을 도운다면 그 대답을 받아들이고 그 사람에게 시간을 보답해야합니다. – XAMlMAX