C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

ログ内検索
  • キーワードを複数指定する場合は 半角スペース で区切ってください。
  • 検索条件は、(AND)=[A かつ B] (OR)=[A または B] となっています。
  • [返信]をクリックすると返信ページへ移動します。
キーワード/ 検索条件 /
検索範囲/ 強調表示/ ON (自動リンクOFF)
結果表示件数/ 記事No検索/ ON
大文字と小文字を区別する

全過去ログを検索

<< 0 | 1 >>
■41420  Re[9]: C#における値渡しと参照渡しのコーディングについて
□投稿者/ simanoha -(2009/09/19(Sat) 17:03:33)
    No41403 (魔界の仮面弁士 さん) に返信
    > 2009/09/19(Sat) 10:59:13 編集(投稿者)

    > BackgroundWorker の RunWorkerCompleted イベントや、
    > ADODB.Connection の InfoMessage イベントのように、
    > イベント引数で例外情報を伝えるという状況を想定しています。

    イベントで例外を投げるという方法もあるんですね。

    >たとえば戻り値で実装するなら、RunWorkerCompletedEventArgs クラスのプロパティのように、
    >詳細なエラー情報をデータと共に併せ持つといった方法もあるかと思います。

    確かに、その方法なら"out"や"ref"の記述もないですし、使いやすそうです。

    >そのライブラリが DLL 参照では無く、プロジェクト参照としてソリューションに組み込まれているならば、
    >定数名が変更されれば、それを利用する側も機械的にリファクタリングできるかと思います。

    そんな便利な方法があるんですね。調べてみます。

    >ところで private ならばともかく、外部公開されている定数名を後から変える理由は何なのでしょうか?

    携わるプロジェクト規模が小さいので、仕様が変わりやすく、
    定数名にいたっても同様の状況です。
    チェック環境(人も時間も…)も整っていないので、
    コード面で予防効果が高い方法を選択したいと思った次第です。

    その他、おかげさまで、一つ一つの現実的な実現方法が見えてきました。
    経験者の方からの貴重なご意見、どうもありがとうございました。
記事No.41320 のレス / END /過去ログ71より / 関連記事表示
削除チェック/

■41425  Re[10]: C#における値渡しと参照渡しのコーディングについて
□投稿者/ 渋木宏明(ひどり) -(2009/09/19(Sat) 18:12:48)
>
    2009/09/19(Sat) 18:52:50 編集(投稿者)

    >>BackgroundWorker の RunWorkerCompleted イベントや、
    >>ADODB.Connection の InfoMessage イベントのように、
    >>イベント引数で例外情報を伝えるという状況を想定しています。
    >
    > イベントで例外を投げるという方法もあるんですね。

    この場合は、「スレッドを跨ぐのでやむを得ない(=ワーカースレッドで発生した例外をプライマリスレッドに直接伝達する方法が無い&そんなことされても迷惑だ)から」という事情があるからです。

    「エラーの発生を伝える手法の一つとして、イベントを使用するのが一般に正しい設計である」というわけではありません。

    > >たとえば戻り値で実装するなら、RunWorkerCompletedEventArgs クラスのプロパティのように、
    > >詳細なエラー情報をデータと共に併せ持つといった方法もあるかと思います。
    >
    > 確かに、その方法なら"out"や"ref"の記述もないですし、使いやすそうです。

    あまりよい設計とは思えません。

    メソッドの戻り値にエラー情報まで含めると、メソッド本来の責務がぼやけてしまいます。
    メソッドの責務の性質上「そうする必要がある」のでない限り、避けるべきと思います。

    > >ところで private ならばともかく、外部公開されている定数名を後から変える理由は何なのでしょうか?
    >
    > 携わるプロジェクト規模が小さいので、仕様が変わりやすく、
    > 定数名にいたっても同様の状況です。
    > チェック環境(人も時間も…)も整っていないので、
    > コード面で予防効果が高い方法を選択したいと思った次第です。

    そういった問題は、ソースコード管理ツールと IDE のリファクタリング機能の利用で十分対応できると思いますよ。

    # Java で開発したことがあるなら、Eclips や SVN, git なんかを使った経験ありそうな気もしますが。
記事No.41320 のレス /過去ログ71より / 関連記事表示
削除チェック/

■41433  Re[10]: C#における値渡しと参照渡しのコーディングについて
□投稿者/ 魔界の仮面弁士 -(2009/09/19(Sat) 19:25:37)
    No41420 (simanoha さん) に返信
    >>BackgroundWorker の RunWorkerCompleted イベントや、
    >>ADODB.Connection の InfoMessage イベントのように、
    >>イベント引数で例外情報を伝えるという状況を想定しています。
    > イベントで例外を投げるという方法もあるんですね。
    あとは、DataGridView の DataError イベントなどもそうかな。。。

    ただ、エラーをイベントで通知するのは、かなり特殊なパターンです。
    今回の実装で使う必要は無いと思います。


    >> たとえば戻り値で実装するなら、RunWorkerCompletedEventArgs クラスのプロパティのように、
    >> 詳細なエラー情報をデータと共に併せ持つといった方法もあるかと思います。
    > 確かに、その方法なら"out"や"ref"の記述もないですし、使いやすそうです。
    # あれ。肯定されてしまったのかな? (^^;

    使いやすいかどうかの判断はお任せしますが、あまり一般的なパターンでは無いと思いますよ。

    「エラー情報も含め、それが取得すべき情報の一部である場合」には使えるかも知れませんが
    あくまで情報の取得がメインであり、エラー発生は特殊なパターンであるならば、
    素直に Exception を throw した方が、処理としては自然な気がします。

    # "エラー" という言葉にどこまでの範囲を含めるのかにもよりますが。


    >> ところで private ならばともかく、外部公開されている定数名を後から変える理由は何なのでしょうか?
    > 携わるプロジェクト規模が小さいので、仕様が変わりやすく、
    世の中には、規模が大きいのに、時間も人でも少なくて、仕様を確定しきれ(以下自粛
記事No.41320 のレス /過去ログ71より / 関連記事表示
削除チェック/

■41464  Re[11]: C#における値渡しと参照渡しのコーディングについて
□投稿者/ simanoha -(2009/09/20(Sun) 00:34:34)
    No41425 渋木宏明(ひどり)さん
    No41433 (魔界の仮面弁士 さん) に返信

    お二方のご指摘、ごもっともです。
    おっしゃることは、自分でも考えていたのですが、自信がなかったといいますか…。
    言語が変わったことで違いにばかり目が行ってしまっていました。
    JavaでもC#でもオブジェクト指向の流儀は変わらないということを
    肝に銘じたいと思います。

    #いろいろ知らないツールもあるようですので、活用するべく調べたいと思います。
記事No.41320 のレス / END /過去ログ71より / 関連記事表示
削除チェック/

■91660  Re[5]: async/awaitの使い方
□投稿者/ 魔界の仮面弁士 -(2019/07/18(Thu) 10:26:44)
    2019/07/18(Thu) 10:55:18 編集(投稿者)

    以下、自分の認識です。
    おかしな所があったら突っ込み歓迎。


    No91657 (こまお さん) に返信
    > 1) 私のコードで(1)をすると(2)へ来なくなる理由(デッドロック?)

    No91647 のコードで言うと、フィールド変数 busy を書き換えている箇所は、
    UI スレッド上で動作することになります。(Task 部は別スレッド)

    つまり、「busy = false に戻す処理」と「Button_Click 内でのループ監視」が、
    いずれも UI スレッドであることが問題になります。busy = false; に書き戻そうにも、
    UI 側で、Button_Click がまだ終わっていない状態なので、処理を差し戻せません。


    一つのスレッドで複数の処理を同時には実行することはできませんので、
    busy = false に戻す処理は、Button_Click の処理完了まで待たされることになります。
    しかし Button_Click は、ループ監視によって、busy = false; への変化を
    待ち続けている状態なので、デッドロックします。

    No91650 のコードでは、処理を差し戻す余地を与えるため、DispatcherFrame を利用しています。
    WinForms でいうところの DoEvents のようなものです。
    https://docs.microsoft.com/ja-jp/dotnet/api/system.windows.threading.dispatcherframe


    > 2) 上記に関係すると思いますが、仮面弁士さんの2番目の様にするとうまくいく理由

    No91651 のコードで言うと、「busy = true;」までは UI スレッド。
    「Task.Run」はワーカースレッド A。
    「ContinueWith」がワーカースレッド B。

    スレッド B は A の後に実行されるようになっていますが、
    それぞれは UI スレッドとは独立しています。

    busy = false; にする処理を、UI スレッドに行わせるのではなく、
    ワーカースレッドで行う事になるので、 No91647 のように阻害されることがありません。

    ただし、TaskScheduler.Current を TaskScheduler.FromCurrentSynchronizationContext() に
    変更した場合は、ContinueWith 部が UI スレッドのコンテキストとなるため、
    No91647 と同じ道を辿ることになります。 No91650 を併用しない限りは。


    それぞれの処理部で Thread.CurrentThread.ManagedThreadId を
    Debug.WriteLine してみると、どのスレッドが呼ばれているかを
    確認できるのではないでしょうか。


    > 3) ContinueWith()に渡すAction<Task>の引数tとは何か

    文字通りの Task です。

    AsyncTest クラス内に
     private void Done(Task t) { busy = false; }
    を用意して、
     await Task.Run(〜).ContinueWith(Done, TaskScheduler.Current);
    と書くのと同じことです。


    なお、await 処理のところを
     Task taskObj = Task.Run(〜);
     await taskObj.ContinueWith(Done, TaskScheduler.Current);
    に書き換えた場合、Done の引数 Task t に渡されるインスタンスは、
    上記の taskObj と同一の物となります。
記事No.91647 のレス /過去ログ158より / 関連記事表示
削除チェック/

<前の20件

<< 0 | 1 >>

パスワード/

- Child Tree -