2017-01-09 24 views
0

結果を返す前に関数が特定の外部値を待つようにする方法はありますか?ここ は非常に初歩的な例である:関数の結果を保持する前に値を待つ

Function DoSomething() As boolean 
'' ... do something external that takes time and sets a Registry value when done 
'' ... 

    Dim isTaskDone as Boolean 

    Do Until isTaskDone = True 
    isTaskDone = Registry.GetValue("ExternalValuePath", "valName", 0) 
    Loop 

    Return var 
End Function 

これは実際に私のニーズのために動作しますが、私は多分思っていたこれを達成するためのよりエレガントな方法は何ですか? また、私はこの解決策がそれをそのまま残すことができるかどうか確かではありません(Untilを使用して効果的に機能を停止させる)。
私はかなり曖昧な質問をお詫び申し上げます。

更新:
私は1つの関数を呼び出すことができ、必要なすべてを行い、すべてが完了したときに結果を返す単純な1コールソリューションを探していると思います。だから私はそれが安全であることを知っています。
私はTimersでこれを試しましたが、Timersを使用すると、すべてをワンコールソリューションに含めることはできません。

+0

なぜあなたは待つ必要がありますか?この[Registry.GetValue'](https://msdn.microsoft.com/en-us/library/microsoft.win32.registry.getvalue(v = vs.110).aspx)メソッドですか?そうであれば、3つのパラメータを除いてコンパイルするべきではありません。 –

+0

この関数は、外部アプリケーションにコマンドを送信し、それらが終了してデータをディスクに保存するまで待機します。 これらの外部アプリケーションによって保存されたデータを使用する必要があります。保存されたデータの最新バージョンを取得していることを確認するために、私は待つ必要があります。 –

+0

申し訳ありません。私は私の例の可読性を向上させるために簡素化していました。はい、それはレジストリを読むための一般的な方法です。 –

答えて

2

WMIを使用してレジストリウォッチャーを作成する方がよいでしょう。 linkを参照してください、そのC#でVB.Netで変換するには問題がありません

+0

返事をありがとう。私はこれを調べます。 –

1

あなたの方法はあなたのUIをロックして(CPUサイクルを浪費する)ビジーな待機ループを使用します。これにはBackgroundWorkerを使用することもできますが、Timerで実現する可能性もあります。おそらくそれほどエレガントではないかもしれませんが、インターフェースをフリーズすることはありません。

これを関数にするのではなく、Subが行います。次にTimerをデフォルトのIntervalに100を加えてください。あなたのDoSomething Subには、Enableというタイマーがあります。あなたのタイマーコードはこのようなものになります

Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick 

    If Registry.GetValue("ExternalValuePath", "valName", 0) Then 
     Timer1.Enabled = False 
     'do whatever needs to be done next 
    End If 

End Sub 
+0

返信いただきありがとうございます!事は、私はすでに 'Timers'でこれをやろうとしています。そしてそれは働いた。私が「タイマー」について気に入らなかったのは、「ティック」は、サブタイトルから「タイマー」を開始するSubです。タイマーでこれを行うことはできませんし、すべてを1つのサブ/関数に含めることはできますか? 私が探しているのは、ワン・ファンクション・ソリューションのようなものです。私はその関数を呼び出して、必要なものすべてを実行し(他のシステム・アプリケーションにデータを送信します)、すべてが完了したときのみ結果を返します。 。 –

+0

@EdgarsMiškins私はUIやCPUの問題を引き起こさずにそう信じていません。他の答えでもムクルは答えました。あなたが何らかの非同期通信をしているときには、ループ内に座っていなくてはならないか、ポーリング(タイマー)を行うか、通常は最善のルートである何らかのコールバックイベントを実行する必要があります。彼の答えは後者に近いでしょう。 – topshot

関連する問題