X



ふらっと C#,C♯,C#(初心者用) Part135
レス数が950を超えています。1000を超えると書き込みができなくなります。
0001デフォルトの名無しさん (ワッチョイ 8b75-uWnk)
垢版 |
2018/02/04(日) 22:02:28.59ID:FbKpa1HN0
「どんなにくだらないC#プログラミングやVisual C#の使い方に関する質問でも誰かが優しくレスをしてくれるスレッド」です。
他のスレッドでは書き込めないような低レベルな質問、
質問者自身なんだか意味がよく分からない質問、
ググろうにもキーワードが分からないなど、勇気をもって書き込んでください。
内容に応じて他スレ・他板へ行くことを勧められることがあります。ご了承下さい。
なお、テンプレが読めない回答者、議論をしたいだけの人は邪魔なので後述のC#相談室に移動して下さい。
C#に関係の無い話題や荒らしの相手や罵倒レスはやめてください

>>980を踏んだ人は新スレを建てて下さい。
>>980が無理な場合、話し合って新スレを建てる人を決めて下さい。

■前スレ
ふらっと C#,C♯,C#(初心者用) Part134
http://mevius.5ch.net/test/read.cgi/tech/1511951038/
■関連スレ
C#, C♯, C#相談室 Part95
http://mevius.5ch.net/test/read.cgi/tech/1508180530/
C#, C♯, C#相談室 Part93
https://mevius.5ch.net/test/read.cgi/tech/1492818720/

■コードを貼る場合は↓を使いましょう。
http://ideone.com/
https://dotnetfiddle.net/

■情報源
https://msdn.microsoft.com/ja-jp/library/gg145045.aspx
https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/index
https://msdn.microsoft.com/en-us/library/gg145045.aspx
http://referencesource.microsoft.com/
VIPQ2_EXTDAT: default:vvvvv:1000:512:----: EXT was configured
0851デフォルトの名無しさん (ワッチョイ f0ea-je3A)
垢版 |
2018/02/27(火) 11:58:10.40ID:p2sOgdSs0
>>850
どんな環境で何を見て始めたのか知らないけども、
VSならプロジェクト作成から「Windows フォーム アプリケーション」を選んで実行すれば、
空のウィンドウが表示される
初心者ならコマンドプロンプトで作らなくていいんじゃね?
0855デフォルトの名無しさん (ワッチョイ e206-MTlB)
垢版 |
2018/02/27(火) 12:47:38.51ID:SDSkuy0K0
>>850
おそらくSystem.Windows.Forms.dllへの参照が埋め込まれていないんじゃないかと
うちの環境だとIDE入ってるせいかSystem.Windows.Forms.dllへの参照は勝手に入るが

コンパイルエラーコードはこの辺りに纏まっている
https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/compiler-messages/CS0234
といってもVSはVSでエラーコードに関してヘルプをBingで検索しだす奇天烈仕様
0857850 (ワッチョイ 26eb-g0eH)
垢版 |
2018/02/27(火) 13:36:31.89ID:/SsV5BVS0
回答ありがとうございます
実際の対策としてVS導入はするつもりですが、

知識欲として、参照が埋め込まれていない状態をIDE介さずに解消するのは難しいのでしょうか?
0859デフォルトの名無しさん (ワッチョイ e206-MTlB)
垢版 |
2018/02/27(火) 13:56:12.87ID:SDSkuy0K0
>>857
URLの/reference (メタデータのインポート)は読んだ?より具体的なら↓のとか

ソース ファイルが格納されているディレクトリで次のコマンドを実行します
https://docs.microsoft.com/ja-jp/dotnet/framework/winforms/controls/how-to-develop-a-simple-windows-forms-control

https://docs.microsoft.com/ja-jp/dotnet/framework/winforms/how-to-create-a-windows-forms-application-from-the-command-line
こちらだとcscにはライブラリの指定がないね、IDEというよりSDKやTargeting Packの設定なのかもしれん
0864デフォルトの名無しさん (ワッチョイ 2175-42by)
垢版 |
2018/02/27(火) 20:08:50.02ID:zlwrDvPF0
>>857
csc test.cs -r:System.Windows.Forms.Dll
でもできない?
0865デフォルトの名無しさん (アウアウウー Sa08-MTlB)
垢版 |
2018/02/27(火) 20:14:25.43ID:hIuQGxZha
でも正直なところ一般人の目に付く範囲のアプリってoffice除いたら
大体htmlで構成されてるものが多いんじゃないか
そうじゃなくてもネットワークがないと何も始まらない
0867デフォルトの名無しさん (ワッチョイ f41e-a/z7)
垢版 |
2018/02/27(火) 20:44:37.33ID:Ee9DX7nT0
Webの特にフロントエンドはひどすぎるな。JavaScript。
生産性の低い道具を使って仕事たくさん生み出そうってことなんだろう。
俺もReactだけは勉強したけどさw
去年のQiitaアドベントみると去年はVue.jsだったのか?ww
アホすぎ
0868デフォルトの名無しさん (ワッチョイ 2175-xOks)
垢版 |
2018/02/27(火) 20:58:24.68ID:zlwrDvPF0
スレチ
0869デフォルトの名無しさん (ワンミングク MM3e-2hJC)
垢版 |
2018/02/27(火) 21:09:13.36ID:IHLOiVm0M
業務系はレイヤー分割下手くそな初心者みたいなSE, PGばっかりだから
フロントを入れ替える=全改修みたいな悲惨な事になるから、頻繁にフロントを変えるって発想ができないんだろう
ここにはどうしても高い文明の壁があるから分かり合えることはない
0870829 (ワッチョイ 24c3-4sh6)
垢版 |
2018/02/28(水) 00:45:23.33ID:ZfoI/UP10
ちょっと流れてしまいましたか、貴重な意見ありがとうございます。
教えていただいたページで勘違いしていたところがスッキリしました。

WPF登場してから時間が立っているからか、古く感じてしまうのは仕方なしなのかな、と思う一報、クライアントアプリを扱う現場ではまだまだ全盛、WinFormも負けてられない勢いで使われているとおもいます。

また、一部、EFはサーバーサイドで…と言う意見もいただきましたが、クライアントでも、問題ないですよね、多分。
というか今回の質問としてはwebでないので3層は意識せず、でもUIとロジックの分離、その先の責務の分離を考えると、良い方法かな、と思いますが…じゃあEF使わないんだったら、どうしよう、constでクエリ定義してDataAdapterにぶっ込む…なんてしたくなかったですし。。。

もう少し調査は必要かもですが、ちょっとやってみたいと思います。
0871デフォルトの名無しさん (ワッチョイ 709d-saxG)
垢版 |
2018/02/28(水) 03:45:22.69ID:Tpz3pZ6h0
>ここにはどうしても高い文明の壁があるから分かり合えることはない
例えばどんなところが「高い壁」といえるんだ?
0873デフォルトの名無しさん (ワッチョイ 709d-saxG)
垢版 |
2018/02/28(水) 08:03:55.13ID:Tpz3pZ6h0
高いか低いかそれすらわからない。要するに何もわからないという壁だな。w
0876デフォルトの名無しさん (ワッチョイ 9c03-07Zo)
垢版 |
2018/02/28(水) 22:27:40.29ID:6WnrRHIY0
>>875
おまえがなんとなく理解出来るんなら大体の人は正確に理解できんじゃね?
0883デフォルトの名無しさん (ワッチョイ 6775-LhZF)
垢版 |
2018/03/01(木) 13:33:07.63ID:6vJouTff0
スレチ
0885デフォルトの名無しさん (ワッチョイ df9d-wl/W)
垢版 |
2018/03/01(木) 19:58:55.12ID:AzZlAoZA0
te
0886デフォルトの名無しさん (ワッチョイ df9d-wl/W)
垢版 |
2018/03/01(木) 20:03:50.95ID:AzZlAoZA0
Task taskA = Task.Run(async () => {
int count = 60;//6sec
while (count-- > 0) {
Debug.Print("sw0:" + sw.ElapsedMilliseconds.ToString());
await Task.Delay(100);
Debug.Print("sw1:" + sw.ElapsedMilliseconds.ToString());
}
} );
taskA.Wait(5000);
5秒で一旦止まるように見えるが、暫くするとまたタスクは回り始める。C#バグかよ。
0887デフォルトの名無しさん (ワッチョイ df9d-wl/W)
垢版 |
2018/03/01(木) 20:10:43.58ID:AzZlAoZA0
しかもUIは5秒間止まってしまう。TASKの意味ないよ。書き方を間違ってるんだろうか?
0890デフォルトの名無しさん (ワッチョイ df06-k3ZN)
垢版 |
2018/03/01(木) 20:34:30.22ID:quAhlzft0
>>886-887
何だか良く分からないけど、どうみても6秒以上掛かるコードだし
Wait()はタイムアウトしても終了させないし、待機時間ブロックする
UIスレッドでしたら固まるし、awaitは解放したいスレッドで使う物だよ
0892デフォルトの名無しさん (ワッチョイ df9d-wl/W)
垢版 |
2018/03/01(木) 20:37:12.88ID:AzZlAoZA0
>>888
上はFormに貼り付けたボタンイベントで実行してるだけ。それなのにボタンを押したら
5秒間フォームが固まる。w
0895デフォルトの名無しさん (ワッチョイ df9d-wl/W)
垢版 |
2018/03/01(木) 20:44:04.03ID:AzZlAoZA0
>>891
 サンプル見て書いたつもりだったが、間違いでしたか?
Asyncが非同期処理を宣言するような機能で、Awaitは解放するスレッドに付けるのだから、Task.Delay(100)を
解放してUIに戻す.つまり100msec待ちながらもUIに制御を戻すってことではないのか?
0899デフォルトの名無しさん (ワッチョイ df06-k3ZN)
垢版 |
2018/03/01(木) 20:52:01.74ID:quAhlzft0
>>895
Taskはスケジューラを指定しない限りワーカースレッドで動くよ
その非同期ラムダでawaitしてもワーカースレッドが解放されてるだけ
UIスレッドで非同期待機するなら作成側を非同期メソッドにしてawaitする
0902デフォルトの名無しさん (ワッチョイ df9d-wl/W)
垢版 |
2018/03/01(木) 20:59:14.26ID:AzZlAoZA0
>WaitでGUIのスレッドを使って待機してるのでGUIはその間動かない
>5秒たつと待つのをやめてそのまま進む

 GUIのスレッドを使って待つの当然でしょ。それが目的だから。だめなの?
じゃあどこで待てばいいのだ? 

void ボタン_Click(){
TaskAを実行(起動);
TaskAの完了を待();
}
処理の流れはこうだけど、これは駄目ってこと? じゃあどうするの?
void ボタン_Click(){
TaskAを実行(起動);
}
どっか別のところで、例えばタイマー割り込みで
TaskAの完了を待();
ってことか? 流れがわかり難いので不細工だよな。「シーケンシャルに流れを書いて且つUIが
止まらない」というようになってないと駄目だろ。
0903デフォルトの名無しさん (アウアウウー Sa2b-k3ZN)
垢版 |
2018/03/01(木) 21:00:06.29ID:73H1EZrda
ちょっと語弊があるな

間違った理解

awaitがあるとUIに制御を戻す
awaitがついたメソッドに出会うとUIはその場で対象のメソッドの終了を待つ

2番目が特に誤解を招きやすい
0909デフォルトの名無しさん (ワッチョイ df06-k3ZN)
垢版 |
2018/03/01(木) 21:18:31.12ID:quAhlzft0
>>902
いやだから…そのWait()の代わりにawaitをUIメソッドに書くんでしょうが…
そうすれば一旦スレッド制御を返し、Taskが終われば取り戻し再開してくれる

レガシーな書き方だってTaskScheduler.FromCurrentSynchronizationContext()を指定して
ContinueWith()すれば良いし、UIコンテキスト取得しといてワーカースレッドから投げても良い
0911デフォルトの名無しさん (ワッチョイ df9d-wl/W)
垢版 |
2018/03/01(木) 21:23:58.40ID:AzZlAoZA0
>Taskはスケジューラを指定しない限りワーカースレッドで動くよ
>その非同期ラムダでawaitしてもワーカースレッドが解放されてるだけ
>UIスレッドで非同期待機するなら作成側を非同期メソッドにしてawaitする

言ってることの意味がわからない。Async()=>{}にしてるでしょ。
しかもこのラムダはRunが確保したスレッドプールで動作してるんでしょ。意味的にそうでないと
可笑しい。でラムダのその中でawaitしてるんだから、、、、って
UIスレでボタン受付
    スレ4000でラムダ起動
             AWAITでスレ4001にスイッチして100msec待つ
    100msec完了でスレ4000に戻る。
    スレ4000でループ
Task.Wait(3000)はUIスレでスレ4000の終了を待ってる。
ここで待ってる限りUIは止まるってことね。
そういう意味か? 何となく解った。
0913デフォルトの名無しさん (ワッチョイ df9d-wl/W)
垢版 |
2018/03/01(木) 21:26:35.19ID:AzZlAoZA0
>いやだから…そのWait()の代わりにawaitをUIメソッドに書くんでしょうが…
そういうことね。解り申した。
0920デフォルトの名無しさん (アウアウウー Sa2b-dKqy)
垢版 |
2018/03/01(木) 23:57:01.48ID:bUfJPuYla
クライアントアプリならイベントハンドラでの await Task.Run だけ覚えてそこから先は全部同期でいい
WebだとTPL Dataflowとか CancellationToken とかまで踏み込んで使いこなさないとあまり意味ないけど
0922デフォルトの名無しさん (アウアウウー Sa2b-dKqy)
垢版 |
2018/03/02(金) 00:15:37.45ID:SqtcRaFRa
>>921
そもそも勘違いしてるみたいだが、asyncはオーバーヘッドが大きいから一般にはなるべく使わないほうがいい。
じゃあWebではなぜ逆に非同期を全面的に積極的に使うかというと、
多数のリクエストを同時に処理するときのスレッドプールの消費を抑えることでメモリ使用量を低減できるから。
クライアントアプリなんか必ず同時に一人しか使わないんだから、UIのイベントの度にRunしても全く問題にならない。
0930デフォルトの名無しさん (ワッチョイ ff7f-9act)
垢版 |
2018/03/02(金) 00:36:23.51ID:biZ1zUn80
>>926
> 結論 – 非常に短いメソッドにasync/awaitを使うことを避ける、あるいはきついループ内でawaitステートメントを持つことをを避ける
使い所を間違えるなとしか書いて無い。
「一般にはなるべく使わないほうがいい」とか、曲解だよ。
0935デフォルトの名無しさん (ワッチョイ df9d-wl/W)
垢版 |
2018/03/02(金) 04:58:14.52ID:IwZ3DIkv0
0936デフォルトの名無しさん (ワッチョイ df9d-wl/W)
垢版 |
2018/03/02(金) 05:58:54.00ID:IwZ3DIkv0
var cant = new System.Threading.CancellationTokenSource();//なんじゃこれは?
Task taskA = Task.Run(async () => {
int count = 60;//6sec
while (count-- > 0) {
 〜処理
 cant.Token.ThrowIfCancellationRequested();//例外発生
}
}, cant.Token );
何じゃらほい? 大したことできんのにたいそうな名前を付けやがって笑える。普通にflg使ったらいいだけだろ。
0938デフォルトの名無しさん (ブーイモ MMcf-dKqy)
垢版 |
2018/03/02(金) 09:21:22.43ID:QlU5Q+B8M
>>934
何が面白いのか知らないけど、同期でREST APIを呼ぶケースなんて普通にあるぞ

>>936
正しい非同期メソッドは必ずCancellationTokenを引数として受け取る
そして、非同期メソッドからさらに別の非同期メソッドを呼ぶときには引数にcantを渡す
そうやって共通のCancellationTokenを引き回すことで、別の非同期メソッドを呼んでる間でも待機状態を確実にキャンセルできる
同期ならabortすりゃいいだけだけどね
0939デフォルトの名無しさん (ワッチョイ df9d-wl/W)
垢版 |
2018/03/02(金) 12:17:26.88ID:IwZ3DIkv0
>>938
すいません。笑えませんでした。
0942(ワッチョイ df9d-wl/W)
垢版 |
2018/03/02(金) 13:28:13.40ID:IwZ3DIkv0
これってどういう意味があるの?単純にフラグを叩けばいいだけだろ。大して利点があるようには思えんが?
ManualResetEventの代わりにflg=Flseで初期化しておいて、setのところでflg=trueにして、
while(!flg);で待機したらいいだけではないのか?

var waitHandle = new ManualResetEvent(false);
Task.Run(() => {Thread.Sleep(2000);  waitHandle.Set(); });
 Console.WriteLine("Wait");
waitHandle.WaitOne(Timeout.Infinite);
0944デフォルトの名無しさん (ワッチョイ df9d-wl/W)
垢版 |
2018/03/02(金) 15:56:09.38ID:IwZ3DIkv0
100msecのタイマー割り込みの中でこういうのを順番に実行する。
void timer1(){
switch( state){
case 0:
if( do1() ){state++;}; break;
case 1:
if( do2() ){state++}; break;
case 2:
if( do2() ){state=0}; break;
}
}
何かもっとスマートな書き方はないか?
0947デフォルトの名無しさん (ワッチョイ df9d-wl/W)
垢版 |
2018/03/02(金) 16:57:54.42ID:IwZ3DIkv0
Stateを使いたくない。
while(1){
while(!do1()){ wait(100);}
while(!do2()){ wait(100);}
while(!do3()){ wait(100);}
}
こんな感じでなんかいい書き方は?
0950デフォルトの名無しさん (ワッチョイ df9d-wl/W)
垢版 |
2018/03/02(金) 18:21:47.40ID:IwZ3DIkv0
>>949
 遅延は無視できるレベル。
>>948
 ならない。というかStateは使いたくない。
0951デフォルトの名無しさん (アウアウエー Sa9f-OA7j)
垢版 |
2018/03/02(金) 18:26:56.36ID:AXJZJbYfa
>>944
ネタっぽい質問だけどこんなのでも作るとか

public class RoundRobin
{
  int index = 0;

  RoundRobin(params Action[] jobs)
  {
    if (jobs == null || jobs.Length == 0) jobs = new Action[] { () => { } };
    this.Jobs = new ReadOnlyCollection<Action>(jobs);
  }

  public ReadOnlyCollection<Action> Jobs { get; private set; }

  public void DoNext()
  {
    Jobs[index]();
    index = ++index % Jobs.Count;
  }
}

余談だけど、組み込みか何かの人?
タイマー割り込みてw
レス数が950を超えています。1000を超えると書き込みができなくなります。

ニューススポーツなんでも実況