第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

異步操作已取消但仍需要時(shí)間來更新網(wǎng)格

異步操作已取消但仍需要時(shí)間來更新網(wǎng)格

C#
牧羊人nacy 2022-07-23 09:12:29
我在使異步操作正常工作時(shí)遇到了一些麻煩(異步操作的新手)。我的目標(biāo)是讓“加載數(shù)據(jù)”按鈕退出并從數(shù)據(jù)庫中檢索一些數(shù)據(jù)并填充網(wǎng)格。對于某些用戶而言,數(shù)據(jù)庫可能有些遠(yuǎn),此操作可能需要一些時(shí)間??紤]到這一點(diǎn),我希望用戶能夠選擇取消并選擇檢索較小的數(shù)據(jù)集。我主要使用當(dāng)前流程:用戶單擊“加載數(shù)據(jù)...”按鈕按鈕更改為“取消”,異步操作開始檢索數(shù)據(jù)檢索數(shù)據(jù)并填充網(wǎng)格這一切都運(yùn)行良好,除了,如果用戶單擊取消,它仍然需要相同的時(shí)間來獲取所有數(shù)據(jù)以使網(wǎng)格變?yōu)榭铡_@讓我相信長時(shí)間運(yùn)行的操作實(shí)際上并沒有被取消......但是,當(dāng)我在“FindForLocationAsync”方法中調(diào)試時(shí),如果用戶請求取消令牌確實(shí)會(huì)停止迭代操作并提前從該方法返回消除。很長一段時(shí)間以來,我一直在盡可能多地閱讀,但是,我現(xiàn)在陷入了僵局。任何幫助將不勝感激。取消令牌來源CancellationTokenSource cancellationTokenSource = null;按鈕點(diǎn)擊方法private async void btnSearch_Click(object sender, EventArgs e){    gridLog.DataSource = null;    Cursor = Cursors.WaitCursor;    if (btnSearch.Text.ToLower().Contains("load"))    {        btnSearch.Text = "Cancel";        btnSearch.ForeColor = Color.White;        btnSearch.BackColor = Color.Red;        //get params to pass        /* snip */        cancellationTokenSource = new CancellationTokenSource();        await Task.Run(() =>            {                var ds = DocLog.FindForLocationAsync(docType, subType, days, currLocation.ID, cancellationTokenSource.Token).Result;                gridLog.DataSource = ds;            });        btnSearch.Text = "Load Data...";        btnSearch.ForeColor = Color.Black;        btnSearch.BackColor = Color.FromArgb(225, 225, 225);    }    else    {        cancelSearch();        btnSearch.Text = "Load Data...";        btnSearch.ForeColor = Color.Black;        btnSearch.BackColor = Color.FromArgb(225, 225, 225);    }    Cursor = Cursors.Default;}取消方法private void cancelSearch(){    if (cancellationTokenSource != null) cancellationTokenSource.Cancel();}長時(shí)間運(yùn)行方法
查看完整描述

1 回答

?
RISEBY

TA貢獻(xiàn)1856條經(jīng)驗(yàn) 獲得超5個(gè)贊

這是您修改為 C# 慣用的代碼async

請注意以下事項(xiàng):

  • 異步代碼通常是指涉及異步 IO 的操作,其中完成信號(hào)(和后續(xù)完成回調(diào))基本上由硬件中斷和操作系統(tǒng)產(chǎn)生 - 它不應(yīng)與并發(fā)(即多線程)混淆,即使在另一個(gè)線程上運(yùn)行的代碼也可以在概念上被建模為 a Tasktoo(實(shí)際上,Task用于多線程 ( Task.Run) 和 async-IO)。

    • 無論如何,重點(diǎn)是:如果您使用的是async-IO API(例如SqlDataReaderFileStreamNetworkStream等),那么您可能不想使用Task.Run.

  • 除了必須在 UI 線程中運(yùn)行的代碼(即 WinForms 和 WPF UI 代碼)之外,您應(yīng)該始終使用它.ConfigureAwait(false)來允許在可用的后臺(tái)線程中調(diào)用完成回調(diào),這意味著 UI 線程不會(huì)被迫運(yùn)行后臺(tái)代碼.

    • C# 語言設(shè)計(jì)人員意識(shí)到必須發(fā)送垃圾郵件的可怕人體工程學(xué),.ConfigureAwait(false) 并且正在研究解決方案。

  • 一般來說,永遠(yuǎn)不要使用Task<T>.Resultor Task.Wait(),因?yàn)樗鼈儠?huì)阻塞線程并引入死鎖的風(fēng)險(xiǎn)(因?yàn)椴荒茉谧枞木€程上運(yùn)行延續(xù)回調(diào))。僅Task<T>.Result在您驗(yàn)證任務(wù)已完成(或僅執(zhí)行await task)后使用。

  • 您應(yīng)該將 傳遞給您調(diào)用的CancellationToken每個(gè)子方法。Async

其他挑剔:

  • 您可以using()在同一縮進(jìn)級別組合語句并SqlConnection.OpenAsync在創(chuàng)建SqlCommand.

  • camelCase參數(shù)不應(yīng)該PascalCase。

  • 對實(shí)例成員(字段、方法、屬性等)的引用應(yīng)加上前綴,this.以便在視覺上與本地標(biāo)識(shí)符區(qū)分開來。

  • 這樣做if( this.x != null ) this.x.Foo()并不完全安全,因?yàn)樵诙嗑€程程序x中,可以在調(diào)用和調(diào)用之間用另一個(gè)值替換。而是使用保留本地參考的操作員來防止地毯從您下方拉出(它的工作原理如下:保證是線程安全的)。if.Foo()?.X lx = this.x; if( lx != null ) lx.Foo()

  • BindingList是(可以說)一個(gè) UI 組件,不應(yīng)該像你的FindForLocationAsync方法那樣從概念上的“背景”函數(shù)返回,所以我返回 a List<T>,然后 UI 將List<T>a 包裝在BindingList<T>.

代碼:

private async void btnSearch_Click(object sender, EventArgs e)

{

    this.gridLog.DataSource = null;

    this.Cursor = Cursors.WaitCursor;


    if (this.btnSearch.Text.ToLower().Contains("load"))

    {

        this.btnSearch.Text = "Cancel";

        this.btnSearch.ForeColor = Color.White;

        this.btnSearch.BackColor = Color.Red;


        //get params to pass

        /* snip */


        this.cancellationTokenSource = new CancellationTokenSource();


        List<DocLog> list = await DocLog.FindForLocationAsync(docType, subType, days, currLocation.ID, cancellationTokenSource.Token);

        gridLog.DataSource = new BindingList<DocLog>( list );


        this.btnSearch.Text = "Load Data...";

        this.btnSearch.ForeColor = Color.Black;

        this.btnSearch.BackColor = Color.FromArgb(225, 225, 225);

    }

    else

    {

        CancelSearch();

        this.btnSearch.Text = "Load Data...";

        this.btnSearch.ForeColor = Color.Black;

        this.btnSearch.BackColor = Color.FromArgb(225, 225, 225);

    }


    this.Cursor = Cursors.Default;

}


private void CancelSearch()

{

    this.cancellationTokenSource?.Cancel();

}


public async static Task<List<DocLog>> FindForLocationAsync(string DocType, string SubType, int? LastXDays, Guid LocationID, CancellationToken cancellationToken)

{

    List<DocLog> dll = new List<DocLog>();


    using (SqlConnection sqlConnection = new SqlConnection(Helper.GetConnectionString()))

    using (SqlCommand sqlCommand = sqlConnection.CreateCommand())

    {

        await sqlConnection.OpenAsync(cancellationToken).ConfigureAwait(false);


        sqlCommand.CommandText = (LastXDays == null) ? "DocLogGetAllForLocation" : "DocLogGetAllForLocationLastXDays";

        sqlCommand.CommandType = System.Data.CommandType.StoredProcedure;

        sqlCommand.Parameters.Add("@DocType", SqlDbType.NVarChar, 30).Value = DocType.Trim();

        sqlCommand.Parameters.Add("@SubType", SqlDbType.NVarChar, 30).Value = SubType.Trim();

        sqlCommand.Parameters.Add("@LocationID", SqlDbType.UniqueIdentifier).Value = LocationID;

        if (LastXDays != null) { sqlCommand.Parameters.Add("@NumberOfDays", SqlDbType.Int).Value = LastXDays; }


        using( SqlDataReader sqlDataReader = await sqlCommand.ExecuteReaderAsync(cancellationToken).ConfigureAwait(false) )

        {

            while (await sqlDataReader.ReadAsync(cancellationToken).ConfigureAwait(false))

            {

                if (cancellationToken.IsCancellationRequested) break;


                DocLog dl = readData(sqlDataReader);

                dll.Add(dl);

            }

        }

    }


    return dll;

}


查看完整回答
反對 回復(fù) 2022-07-23
  • 1 回答
  • 0 關(guān)注
  • 149 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)