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

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

foreach 內的“跨線程操作無效”

foreach 內的“跨線程操作無效”

C#
哆啦的時光機 2023-09-09 16:50:26
我正在嘗試將數據加載到組合框,并且當我運行表單而不進行調試時它正在工作。但是,當我嘗試使用調試模式運行它時,出現錯誤:System.InvalidOperationException:“跨線程操作無效:從創建它的線程以外的線程訪問控制“ResultBox”。” 我怎樣才能解決這個問題?順便說一句,有一個后臺工作人員在下載數據時寫入消息。我在某處讀到可以使用后臺工作人員解決此問題。這是表單代碼:public Form1()    {        InitializeComponent();        backgroundWorker1.WorkerReportsProgress = true;    }    private void Form1_Load(object sender, EventArgs e)    {        backgroundWorker1.RunWorkerAsync();    }    private Task GetDataTask() {        return Task.Factory.StartNew(() => {            List<Result> results = new List<Result>();            results =  GetResults.GetData("http://worldcup.sfg.io/teams/results/");            foreach (var result in results)            {                ResultBox.Items.Add(result.Fifa_Code);            }        });    }    private void ResultBox_SelectedIndexChanged(object sender, EventArgs e)    {    }    private void SaveTeam_Click(object sender, EventArgs e)    {    }    private async void backgroundWorker1_DoWork(object sender,  DoWorkEventArgs e)    {        await GetDataTask();    }    private void backgroundWorker1_ProgressChanged(object sender,  ProgressChangedEventArgs e)    {        resultsLoadedLabel.Text = (e.ProgressPercentage.ToString() + "%");    }    private void backgroundWorker1_RunWorkerCompleted(object sender,  RunWorkerCompletedEventArgs e)    {        resultsLoadedLabel.Text = "Podaci u?itani!";    }foreach 中的這行代碼出現異常:ResultBox.Items.Add(result.Fifa_Code);這是獲得結果的類:public class GetResults{    public static List<Result> GetData(string url) {        var client = new RestClient();        var request = new RestRequest(url, Method.GET);        request.AddHeader("User-Agent", "Nothing");        IRestResponse<List<Result>> results = client.Execute<List<Result>>    (request);        return results.Data;    }}
查看完整描述

1 回答

?
繁華開滿天機

TA貢獻1816條經驗 獲得超4個贊

如果采用異步,則始終采用異步。RestSharp 允許您進行異步調用


所以你可以重構數據訪問


public class GetResults {


    public static async Task<List<Result>> GetDataAsync(string url) {

        var client = new RestClient();

        var request = new RestRequest(url, Method.GET);

        request.AddHeader("User-Agent", "Nothing");

        IRestResponse<List<Result>> results = await client.ExecuteTaskAsync<List<Result>>(request);

        return results.Data;

    }

}

接下來,由于表單加載是一個事件處理程序,因此您也可以使其異步并加載數據。


public Form1() {

    InitializeComponent();

}


private async void Form1_Load(object sender, EventArgs e) {

    //On UI thread

    resultsLoadedLabel.Text = "Loading data!";

    //get data on separate thread (non blocking)

    List<Result> results = await GetResults.GetDataAsync("http://worldcup.sfg.io/teams/results/");

    //Back on UI thread

    resultsLoadedLabel.Text = "Podaci u?itani!";

    foreach (var result in results) {

        ResultBox.Items.Add(result.Fifa_Code);

    }

}

確保在使用異步調用時訪問 UI 控件時,可以在創建它們的主線程上訪問它們(請參閱注釋)。


查看完整回答
反對 回復 2023-09-09
  • 1 回答
  • 0 關注
  • 123 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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