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

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

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

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

Q&A

解決済

1回答

5901閲覧

C# 一番軽い待機方法を教えてください。

退会済みユーザー

退会済みユーザー

総合スコア0

C#

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

0グッド

0クリップ

投稿2020/03/26 10:00

マウスの設定を変更するコンソールアプリを作っています。

IChromaインスタンスを消してしまうと設定が変わってしまうので、Mainメソッドの最後で待機できるメソッドが必要です。
ConsoleクラスのReadLineメソッドより軽量なメソッドがあったら教えてください、PCが起動してから終了するまで起動するので軽量なメソッドを使用したいです。
よろしくお願いいたします。

コンソールアプリなのでawaitする必要はないのですが、VSが警告を出してきて見栄えが良くないのでRunメソッドを使っています、ここには突っ込みなしてお願いします。

C#

1class Program 2 { 3 static IChroma chroma; 4 static MouseStatic mouseStatic = new MouseStatic(Led.None, Color.Black); 5 6 static void Main(string[] args) 7 { 8 Task.Run(async () => 9 { 10 await Init(); 11 await chroma.Mouse.SetStaticAsync(mouseStatic); 12 }); 13 Console.ReadLine(); 14 } 15 16 static async Task Init() 17 { 18 chroma = await ColoreProvider.CreateNativeAsync(); 19 } 20 }

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

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

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

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

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

Zuishin

2020/03/26 10:06

ReadLine で重いという意味がわかりません。
dodox86

2020/03/26 10:18

何をもってReadLineが「重い」と判断されているのでしょうか。コンソールアプリがアクティブであるときにENTER('\n')入力があるまではCPU使用率がほぼ0で、実用上問題無いはずですが。>質問者さん
m.ts10806

2020/03/26 10:27

何が問題なのか、明記してください。
退会済みユーザー

退会済みユーザー

2020/03/26 10:33

限りなく0に近いのですが、ゲームをするときに快適になるように軽量を追い求めているので、より軽量なメソッドを探しています。 ReadLineメソッドはループを回して文字列を取得しているので、より軽量なメソッドがあるのではないかと思って質問しました。 public virtual string ReadLine() { StringBuilder stringBuilder = new StringBuilder(); int num; for (;;) { num = this.Read(); if (num == -1) { goto IL_43; } if (num == 13 || num == 10) { break; } stringBuilder.Append((char)num); } if (num == 13 && this.Peek() == 10) { this.Read(); } return stringBuilder.ToString(); IL_43: if (stringBuilder.Length > 0) { return stringBuilder.ToString(); } return null; }
退会済みユーザー

退会済みユーザー

2020/03/26 10:36

自作のReadLineではありません、逆コンパイルしたReadLineです。
Zuishin

2020/03/26 10:38

それなら Read() で待機するので大丈夫です。
退会済みユーザー

退会済みユーザー

2020/03/26 10:42

Mainメソッドにasyncをつけることができるのですね、Runメソッドの使用をやめて、C#7.1に変更しました。ありがとうございます。
guest

回答1

0

ベストアンサー

ベンチマーク(?)で測定した訳ではないですが、Windows OSというものを考えた場合に恐らくもっとも軽量な待機方法はWindowsのカーネルイベントオブジェクトを使う方法です。
Windows APIであればCreateEvent APIで生成されるイベントオブジェクトをWaitForSingleObjectで待機する方法で、.NET FrameworkであればAutoResetEventクラスが使えます。

以下はそのAutoResetEventを使ってWaitOneで終了を待機する方法です。行儀が悪いですが、CTRL+Cで強制終了する必要があります。本来はSetでシグナルを発することでWaitOneを抜けてきますし、そうするのが作法です。

C#

1using System; 2using System.Threading; 3 4namespace ConsoleApp1 5{ 6 class Program 7 { 8 static AutoResetEvent autoEvent = new AutoResetEvent(false); 9 static void Main(string[] args) 10 { 11 Console.WriteLine("Program start. (Enter CTRL+C to quit)"); 12 13 autoEvent.WaitOne(); 14 } 15 } 16} 17

投稿2020/03/26 10:35

dodox86

総合スコア9256

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

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

退会済みユーザー

退会済みユーザー

2020/03/26 10:40

回答ありがとうございます、AutoResetEventクラスを初めてしりました。 素晴らしい方法を教えていただきありがとうございます。 皆様回答ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問