質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

2回答

12305閲覧

Timerクラスを使ったが、タイマーが作動しない。理由と作動方法を教えてください

former_neet_cat

総合スコア46

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

0クリップ

投稿2018/10/21 13:52

編集2018/10/21 15:04

10秒毎にメッセージを出力するプログラムを完成させたい

C#で時間経過毎にメールを送るプログラムの一部を作っていました。
しかし、Timerクラスを使用したのですが、よく分からないエラーが出現しました。
調べても内容もイマイチわかりません。
なぜ処理が実行されないのか理由を教えてください。

■■な機能を実装中に以下のエラーメッセージが発生しました。

visual studio でメニューバー?(上の方)で出現したよく分からないエラーメッセージ introduce variable code refactoring provider error ブレークポイントで timer.Elapsed += Timer_Elapsed; に焦点を当てた時 error CS0079: The event 'Timer.Elapsed' can only appear on the left hand side of += or -=

該当のソースコード

C#

1using System; 2using System.Timers; 3using System.IO; 4using System.Text; 5using MitFile; 6 7namespace Exercise 8{ 9 class MainHome 10 { 11 public static int Repetition; 12 public static string transFolderPath = "/Users/XXX/Documents/TransFolder"; 13 public static string devicePath = "/Users/XXX/Documents/DeviceFolder"; 14 public static Timer timer; 15 16 static void Main() 17 { 18 19 Repetition = 0; 20 timer = new Timer(); 21 timer.Interval = 10000; 22 timer.Elapsed += Timer_Elapsed;//タイマーイベントの処理、(時間経過後の処理)を登録 23 timer.Enabled = true;//これを呼ばないとタイマーは起動しない? 24 25 Console.WriteLine("データの転送を開始"); 26 if(Repetition >= 5) 27 { 28 timer.Enabled = false; 29 } 30 } 31 32 private static void Timer_Elapsed(object sender, ElapsedEventArgs e) 33 { 34 try 35 { 36 //Device device = new Device();未完成でコメントアウトしているコード 37 //device.DataCapture(transFolderPath,devicePath);上記に同じ 38 string mes = string.Format("{0} : 転送成功: {1}", DateTime.Now, Repetition); 39 Repetition++; 40 Console.WriteLine(mes); 41 42 } 43 catch 44 { 45 Console.WriteLine("Error"); 46 } 47 48 } 49 50 51 52 } 53 54 55} 56

試したこと

ラムダ式を使用しないコードに変更(する前から同じようなエラー)

補足情報(FW/ツールのバージョンなど)

visual studio for mac 2017 使用

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

timerを生成、起動するのはいいんですが、そのtimerがタイムアップする前にプログラムが終了してしまいます。
それでは動きようもないですねー

投稿2018/10/21 14:00

y_waiwai

総合スコア87774

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

former_neet_cat

2018/10/21 14:08

すいませんが、どうすれば良いのでしょうか? なぜタイムアップする前にプログラムが終了してしまうのか分からないです。
y_waiwai

2018/10/21 14:12

タイマ起動させて、なにをしてるのかプログラムをおっていけばいいと思いますが。 ふつーにmain関数から抜けてしまいますよね、抜けてしまうとプログラムは終了です タイムアップするまで終了しないように待ちを入れましょう
former_neet_cat

2018/10/21 14:21

教えていただきありがとうございます!!
guest

0

教えていただいた回答により解決したコードの実行例

C#

1using System; 2using System.Timers; 3using System.IO; 4using System.Text; 5using MitFile; 6 7namespace Exercise 8{ 9 class MainHome 10 { 11 public static int Repetition; 12 public static string transFolderPath = "/Users/XXXXX/Documents/TransFolder"; 13 public static string devicePath = "/Users/XXXXX/Documents/DeviceFolder"; 14 public static Timer timer; 15 16 protected static void Main() 17 { 18 19 Repetition = 0; 20 timer = new Timer(); 21 timer.Interval = 1000; 22 timer.Elapsed += Timer_Elapsed;//タイマーイベントの処理、(時間経過後の処理)を登録 23 timer.Enabled = true;//これを呼ばないとタイマーは起動しない 24 25 Console.WriteLine("データの転送を開始"); 26 27 28 void Timer_Elapsed(object sender, ElapsedEventArgs e) 29 { 30 try 31 { 32 Repetition++; 33 34 //Device device = new Device(); 35 //device.DataCapture(transFolderPath,devicePath); 36 string mes = string.Format("{0} : 転送成功: {1}", DateTime.Now, Repetition); 37 Console.WriteLine(mes); 38 39 if (Repetition >= 5) 40 { 41 timer.Enabled = false; 42 } 43 44 } 45 catch 46 { 47 Console.WriteLine("Error"); 48 } 49 50 } 51 52 Console.ReadKey(); 53 54 } 55 56 } 57 58 59} 60

投稿2018/10/21 14:25

編集2018/10/21 15:05
former_neet_cat

総合スコア46

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問