-5

メッセージ文字列を返す関数を使用するサードパーティのライブラリを使用しています。私の問題は、どの時点でこのメッセージを受け取るかわからないことです。テキスト ボックスにメッセージを表示するアプリケーションを C# で作成する必要があります。

注: プログラムの実行中に「n」通のメッセージを受信できます。

私が読んだことによると、スレッドを使用する必要がありますが、方法は必要ありません。

私はこれをやろうとしましたが、望ましい結果が得られませんでした:

Thread p1 = new Thread(new ThreadStart(myfuntion));
p1.Start();

public myfunction()
{
    while (true)
    {
        textbox.text = myobj.messages;
    }
}

助けてください!

4

4 に答える 4

0

別のスレッドから GUI を更新することはできないため、使用することをお勧めします。使用Taskする必要があります。Invoke

Task.Factory.StartNew(myfunction);

public void myfunction()
{
    while (true)
    {
        textBox1.Invoke(new Action(() => textBox1.Text = myobj.messages));
    }
}

しかし、私はこのコードに満足していません。このコードは常に GUI を更新しています。各反復間で待機Thread.Sleep(milliseconds)するか、ライブラリ内の何かを使用して、自分で確認する必要がないメッセージがある場合にメッセージを送信することをお勧めします。

于 2012-08-15T06:39:58.407 に答える
0

フォームを使用System.Windows.Forms.Timerしているため、一定間隔で使用できます。

private void StartPollingMessage()
{
    System.Windows.Forms.Timer myTimer = new Timer();
    myTimer.Tick += new EventHandler(myTimer_Tick);
    myTimer.Interval = 200;
    myTimer.Start();
}

void myTimer_Tick(object sender, EventArgs e)
{
    textBox1.Text = myobj.messages;
}
于 2012-08-15T07:28:06.210 に答える
0
void Main()
{
    //this is the line when you start calling the external method
    Parallel.Invoke(() => YourMethod);
}

public void YourMethod()
{
    string s = ExternalMethod();
    //now you can use BackgroundWorker to update the UI or do the same thing as @Amiram Korach suggested
}

public string ExternalMethod()
{
    Thread.Sleep(10000); // the operation to retrieve the string can take 1 hour for example
    return "String that you want to retrieve";
}

// Define other methods and classes here
于 2015-09-20T19:18:46.560 に答える
0

BackGroundWorker を使用するのが好きです。スレッドはフォーム自体から生成されるため、スレッドは依然としてロックを引き起こします。

 private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
    {
        // Do not access the form's BackgroundWorker reference directly.
        // Instead use the reference provided by the sender parameter
        BackgroundWorker bw = sender as BackgroundWorker;

        // Extract the argument
        RequestEntity arg = (RequestEntity)e.Argument;

        // Start the time consuming operation
        Poll poll = new Poll();
        e.Result = poll.pollandgetresult(bw, arg);

        // If operation was cancelled by user
        if (bw.CancellationPending)
        {
            e.Cancel = true;
        }
    }

コードプロジェクトに関する素晴らしい記事も.... 読む

于 2012-08-15T07:06:11.240 に答える