亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

C# 后臺工作者追加文本框

C# 后臺工作者追加文本框

C#
冉冉說 2021-11-21 11:06:50
首先,我想說我是 C# 的新手,所以我不太清楚后臺工作人員應該如何實現。我有一個 GUI 程序,它基本上可以 ping 域并將響應返回到文本框。我能夠讓它正常工作,但是,它凍結了代碼,因為它運行在同一個線程上,這就是我試圖實現后臺工作程序的原因。這是基本設置private void button1_Click(object sender, EventArgs e){    url = textBox1.Text;    button1.Enabled = false;    button2.Enabled = true;    bgWorker.DoWork += new DoWorkEventHandler(bgWorker_DoWork);    bgWorker.RunWorkerAsync();}private void bgWorker_DoWork(object sender, DoWorkEventArgs e){    do    {        if (bgWorker.CancellationPending)            break;        Invoke((MethodInvoker)delegate { monitor(); });    } while (true);}public void monitor(){    textBox2.AppendText("Status of: " + url + "\n");    Status(url);    System.Threading.Thread.Sleep(30000);}private void Status(string url){    // This method does all the ping work and also appends the status to the Text box as it goes through , as OK or down}我之前沒有和 bgworkers 一起工作過,你可以想象這很令人困惑。我看過很多其他的文章,但似乎無法理解。對不起,如果代碼看起來很瘋狂,我正在努力學習。
查看完整描述

3 回答

?
鴻蒙傳說

TA貢獻1865條經驗 獲得超7個贊

使用微軟的反應框架(NuGet“System.Reactive.Windows.Forms”并添加using System.Reactive.Linq;),然后你可以這樣做:


private void button1_Click(object sender, EventArgs e)

{

    var url = textBox1.Text;

    Observable

        .Interval(TimeSpan.FromMinutes(0.5))

        .SelectMany(_ => Observable.Start(() => Status(url)))

        .ObserveOn(this)

        .Subscribe(status => textBox2.AppendText("Status of: " + status + "\n"));

}

然后,您只需要更改Status即可獲得此簽名:string Status(string url).


就是這樣。沒有后臺工作人員。沒有調用。并且Status很好地在后臺線程上運行。


查看完整回答
反對 回復 2021-11-21
?
BIG陽

TA貢獻1859條經驗 獲得超6個贊

你有幾個錯誤。第一的,


Invoke((MethodInvoker)delegate

{

    monitor();

});

將調用monitor()您的 UI 線程。在幾乎所有情況下,您都不應該在其他線程上調用方法。您尤其不應該調用在 UI 線程上阻塞或執行任何需要超過幾毫秒的操作的方法,這就是這樣做的:


System.Threading.Thread.Sleep(30000);

而不是在另一個線程上調用方法;向另一個線程提交不可變數據并讓線程決定何時處理它。BackgroundWorker 中已經內置了一個事件來執行此操作。在您致電之前,請bgWorker.RunWorkerAsync()執行以下操作:


url = new Uri(something);

bgWorker.WorkerReportsProgress = true;

bgWorker.WorkerSupportsCancellation = true;

bgWorker.ProgressChanged += Bgw_ProgressChanged;



private void Bgw_ProgressChanged(object sender, ProgressChangedEventArgs e)

{

    textBox2.AppendText("Status of: " + url + ": " + e.UserState.ToString()

        + Environment.NewLine);

}

你bgWorker_DoWork應該看起來更像這樣:


void bgWorker_DoWork(object sender, DoWorkEventArgs e)

{

    while (!bgw.CancellationPending)

    {

        System.Threading.Thread.Sleep(new TimeSpan(0, 0, 30));

        var status = ResultOfPing(e.Argument as Uri);

        bgw.ReportProgress(0, status);

    }


    e.Cancel = true;

}

你應該這樣稱呼它:


bgWorker.RunWorkerAsync(url);

你還有第二個問題。BackgroundWorker 創建一個線程,并且您的線程將花費大部分時間在計時器上阻塞或等待網絡響應。這是對線程的不良使用。您最好使用完成回調或async/await。


查看完整回答
反對 回復 2021-11-21
?
天涯盡頭無女友

TA貢獻1831條經驗 獲得超9個贊

試試這個代碼:


public partial class Form1 : Form

{

    bool cancel;


    public Form1()

    {

        InitializeComponent();


    }


    public void StartPinging()

    {

        this.cancel = false;

        startButton.Enabled = false;

        stopButton.Enabled = true;

        responseBox.Clear();

        responseBox.AppendText("Starting to ping server.");

        responseBox.AppendText(Environment.NewLine);

        var bw = new BackgroundWorker

        {

            WorkerReportsProgress = false,

            WorkerSupportsCancellation = true

        };

        bw.DoWork += (obj, ev) =>

        {

            while (!cancel)

            {

                // Ping Server Here

                string response = Server.PingServer();


                this.Invoke(new UiMethod(() =>

                {

                    responseBox.AppendText(response);

                    responseBox.AppendText(Environment.NewLine);

                }));

            }

        };


        bw.RunWorkerCompleted += (obj, ev) =>

        {

            this.Invoke(new UiMethod(() =>

            {

                responseBox.AppendText("Stopped pinging the server.");

                responseBox.AppendText(Environment.NewLine);

                startButton.Enabled = true;

                stopButton.Enabled = false;

            }));

        };


        bw.RunWorkerAsync();

    }


    delegate void UiMethod();



    private void startButton_Click(object sender, EventArgs e)

    {

        StartPinging();

    }


    private void stopButton_Click(object sender, EventArgs e)

    {

        responseBox.AppendText("Cancelation Pressed.");

        responseBox.AppendText(Environment.NewLine);

        cancel = true;

    }

}


public class Server

{

    static Random rng = new Random();

    public static string PingServer()

    {

        int time = 1200 + rng.Next(2400);

        Thread.Sleep(time);

        return $"{time} ms";

    }

}

http://img1.sycdn.imooc.com//6199b7f60001f6a108140487.jpg

查看完整回答
反對 回復 2021-11-21
  • 3 回答
  • 0 關注
  • 207 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號