-5

我正在使用第三方库,该库使用返回消息字符串的函数。我的问题是我不知道什么时候会收到这条消息,我需要用 C# 构建一个在文本框中显示消息的应用程序。

注意:我可以在程序运行时收到“n”条消息。

根据我读到的是我需要使用线程,但不是如何。

我试图这样做,但没有得到想要的结果:

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

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

请帮忙!

4

4 回答 4

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 回答
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

您最好使用Task并且必须使用Invoke,因为您无法从另一个线程更新 GUI。

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
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 回答