主頁 > 企業開發 > 如何確保在從函式回傳之前完成任務?

如何確保在從函式回傳之前完成任務?

2021-12-22 08:54:30 企業開發

我對Async/AwaitC# 中的作業方式有很好的理解

我知道當到達await關鍵字時,控制權被交還給呼叫函式,這就是異步執行的實作方式(如果我在這里錯了,我希望得到更正和更好的解釋)。

但是,我不確定如何確保異步函式在從函式回傳之前已完成執行。

以下面的例子為例:

private static async Task<bool> LoadDataIntoLocalAppFile(ZipArchiveEntry entry, string key)
{
    try
    {
        /* SqLiteAsyncConnection is an instance variable in the class that has this function.*/
        string pathToUse = "localDatabase.db"
        if (SqLiteAsyncConnection != null)
        {
            await SqLiteAsyncConnection.CloseAsync()
                .ContinueWith(x => entry.ExtractToFile(pathToUse, true));
        }
        else
        {
            entry.ExtractToFile(pathToUse, true);
        }
        return true;
    }
    catch (Exception ex)
    {
        Colsole.WriteLine(ex.ToString());
        return false;
    }
}

在上面的代碼片段中,我想確保SqLiteAsyncConnection在我用.dbentry 的內容替換檔案中的資料之前是關閉的(這樣它就不會出錯)。因此我已經使用了ContinueWith(如果這是錯誤的,我希望得到一些澄清)。

但我也想確保await SqLiteAsyncConnection.CloseAsync().ContinueWith(x => entry.ExtractToFile(pathToUse, true));在函式回傳之前完成它的執行。那就是我想確保這個函式不會不準確地回傳真,并且在await SqLiteAsyncConnection.CloseAsync() .ContinueWith(x => entry.ExtractToFile(pathToUse, true));完成執行之前它不會回傳真

我如何實作這一目標?

uj5u.com熱心網友回復:

ContinueWith當你在await那里時,你不需要你可以使用ContinueWith,如果你不使用await,它可以被看作是一個型別的回呼,一旦父任務已完成/失敗。

await SqLiteAsyncConnection.CloseAsync()
                .ContinueWith(x => entry.ExtractToFile(pathToUse, true));

//can be replaced by

await SqLiteAsyncConnection.CloseAsync();
entry.ExtractToFile(pathToUse, true);

當您點擊await代碼中的某個部分時,您的函式沒有完成,它沒有回傳true,它在某種意義上被掛起并且控制權回傳給呼叫執行緒。一旦你await所有s 在函式中完成,它才會回傳結果。

uj5u.com熱心網友回復:

當到達await關鍵字時,控制權回傳給呼叫函式。

我發現這個常用的解釋令人困惑。簡單來說,異步方法的作業是創建一個Task. 這就是您呼叫該方法以獲取Task回報的原因。Taskawait在此方法中到達第一個1時,您會得到這個此時異步操作已經開始,(一般)還沒有完成。呼叫者已收到Task表示異步操作的 ,并且可以在操作進行中時繼續做其他事情。在某些情況下,呼叫者沒有什么比等待異步操作完成更好的事情要做,在這種情況下,您會看到以下模式:

await LoadDataIntoLocalAppFile();

這里呼叫者本身就是一個異步方法。我們知道它是因為await關鍵字。上面的代碼等價于:

Task task = LoadDataIntoLocalAppFile();
await task;

當到達第一個await里面時,第一行將完成LoadDataIntoLocalAppFile當里面的最后一行代碼LoadDataIntoLocalAppFile運行時,第二行將完成

1更準確地說,第await一個未完成的等待。

uj5u.com熱心網友回復:

你對async/await的理解是錯誤的,只需要等待異步呼叫就夠了:

private static async Task<bool> LoadDataIntoLocalAppFile(ZipArchiveEntry entry, string key)
{
    try
    {
        string pathToUse = "localDatabase.db"
        
        await SqLiteAsyncConnection?.CloseAsync();
        entry.ExtractToFile(pathToUse, true);
        
        return true;
    }
    catch (Exception ex)
    {
        Colsole.WriteLine(ex.ToString());
        return false;
    }
}

然后呼叫:

await LoadDataIntoLocalAppFile(...

轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/389231.html

標籤:C# 。网 异步等待

上一篇:LINQ:如何從列中找到最受歡迎的專案

下一篇:返回列表

標籤雲
其他(132330) Python(22215) Java(14376) JavaScript(13850) C(10664) 區塊鏈(7949) AI(6680) 基礎類(6313) 腳本語言(PerlPython)(5129) MySQL(4992) 非技術區(4971) Android(4177) Linux(3959) PHP(3481) C語言(3288) C#(3195) C++語言(3117) 爪哇(3103) html(2861) Java相關(2746) 疑難問題(2699) sql(2595) 單片機工控(2479) 数组(2407) R(2405) 熊猫(2318) 反应(2063) Web開發(1951) 網絡通信(1793) VBA(1780) 數據庫相關(1767) VB基礎類(1755) css(1732) 数据框(1665) 開發(1646) 节点.js(1641) ASP.NET(1641) .NETCore(1630) 系統維護與使用區(1617) 基礎和管理(1579) JavaEE(1566) C++(1561) 專題技術討論區(1515) HtmlCss(1494) 蟒蛇-3.x(1492) Windows客戶端使用(1484) 列表(1385) Unity3D(1365) VCL組件開發及應用(1353) json(1335) iOS(1301) .NET技术(1293) 安卓(1264) Qt(1261) HTML(CSS)(1220) 其他技術討論專區(1200) WindowsServer(1195) 打字稿(1182) 查询(1175) 扑(1174)

熱門瀏覽
  • IEEE1588PTP在數字化變電站時鐘同步方面的應用

    IEEE1588ptp在數字化變電站時鐘同步方面的應用 京準電子科技官微——ahjzsz 一、電力系統時間同步基本概況 隨著對IEC 61850標準研究的不斷深入,國內外學者提出基于IEC61850通信標準體系建設數字化變電站的發展思路。數字化變電站與常規變電站的顯著區別在于程序層傳統的電流/電壓互 ......

    uj5u.com 2020-09-10 03:51:52 more
  • HTTP request smuggling CL.TE

    CL.TE 簡介 前端通過Content-Length處理請求,通過反向代理或者負載均衡將請求轉發到后端,后端Transfer-Encoding優先級較高,以TE處理請求造成安全問題。 檢測 發送如下資料包 POST / HTTP/1.1 Host: ac391f7e1e9af821806e890 ......

    uj5u.com 2020-09-10 03:52:11 more
  • 網路滲透資料大全單——漏洞庫篇

    網路滲透資料大全單——漏洞庫篇漏洞庫 NVD ——美國國家漏洞庫 →http://nvd.nist.gov/。 CERT ——美國國家應急回應中心 →https://www.us-cert.gov/ OSVDB ——開源漏洞庫 →http://osvdb.org Bugtraq ——賽門鐵克 →ht ......

    uj5u.com 2020-09-10 03:52:15 more
  • 京準講述NTP時鐘服務器應用及原理

    京準講述NTP時鐘服務器應用及原理京準講述NTP時鐘服務器應用及原理 安徽京準電子科技官微——ahjzsz 北斗授時原理 授時是指接識訓通過某種方式獲得本地時間與北斗標準時間的鐘差,然后調整本地時鐘使時差控制在一定的精度范圍內。 衛星導航系統通常由三部分組成:導航授時衛星、地面檢測校正維護系統和用戶 ......

    uj5u.com 2020-09-10 03:52:25 more
  • 利用北斗衛星系統設計NTP網路時間服務器

    利用北斗衛星系統設計NTP網路時間服務器 利用北斗衛星系統設計NTP網路時間服務器 安徽京準電子科技官微——ahjzsz 概述 NTP網路時間服務器是一款支持NTP和SNTP網路時間同步協議,高精度、大容量、高品質的高科技時鐘產品。 NTP網路時間服務器設備采用冗余架構設計,高精度時鐘直接來源于北斗 ......

    uj5u.com 2020-09-10 03:52:35 more
  • 詳細解讀電力系統各種對時方式

    詳細解讀電力系統各種對時方式 詳細解讀電力系統各種對時方式 安徽京準電子科技官微——ahjzsz,更多資料請添加VX 衛星同步時鐘是我京準公司開發研制的應用衛星授時時技術的標準時間顯示和發送的裝置,該裝置以M國全球定位系統(GLOBAL POSITIONING SYSTEM,縮寫為GPS)或者我國北 ......

    uj5u.com 2020-09-10 03:52:45 more
  • 如何保證外包團隊接入企業內網安全

    不管企業規模的大小,只要企業想省錢,那么企業的某些服務就一定會采用外包的形式,然而看似美好又經濟的策略,其實也有不好的一面。下面我通過安全的角度來聊聊使用外包團的安全隱患問題。 先看看什么服務會使用外包的,最常見的就是話務/客服這種需要大量重復性、無技術性的服務,或者是一些銷售外包、特殊的職能外包等 ......

    uj5u.com 2020-09-10 03:52:57 more
  • PHP漏洞之【整型數字型SQL注入】

    0x01 什么是SQL注入 SQL是一種注入攻擊,通過前端帶入后端資料庫進行惡意的SQL陳述句查詢。 0x02 SQL整型注入原理 SQL注入一般發生在動態網站URL地址里,當然也會發生在其它地發,如登錄框等等也會存在注入,只要是和資料庫打交道的地方都有可能存在。 如這里http://192.168. ......

    uj5u.com 2020-09-10 03:55:40 more
  • [GXYCTF2019]禁止套娃

    git泄露獲取原始碼 使用GET傳參,引數為exp 經過三層過濾執行 第一層過濾偽協議,第二層過濾帶引數的函式,第三層過濾一些函式 preg_replace('/[a-z,_]+\((?R)?\)/', NULL, $_GET['exp'] (?R)參考當前正則運算式,相當于匹配函式里的引數 因此傳遞 ......

    uj5u.com 2020-09-10 03:56:07 more
  • 等保2.0實施流程

    流程 結論 ......

    uj5u.com 2020-09-10 03:56:16 more
最新发布
  • 如何確保在從函式回傳之前完成任務?

    我對Async/Await在C# 中的作業方式有很好的理解。我知道當到達await關鍵字時,控制權被交還給呼叫函式,這就是異步執行的實作方式(如果我在這里錯了,我希望得到更正和更好的解釋)...

    uj5u.com 2021-12-22 08:54:30 more
  • LINQ:如何從列中找到最受歡迎的專案

    我想通過“ItemTitle”列在我的“訂單”表中查找最受歡迎的專案。ItemTitle 具有以下內容: 國王漢堡 夏威夷菜 意大利經典 提拉米蘇 國王漢堡 國王漢堡...

    uj5u.com 2021-12-22 08:53:42 more
  • 如何在EF6.4.4中添加單向一對多關系?

    我有兩個班級:public class Client{ public int Id { get; set; }}public class ClientRequest{ public int Id { get; set; } public int ClientId { get; set; }...

    uj5u.com 2021-12-22 08:52:15 more
  • 為什么.Net回傳無窮大?

    這沒有任何意義。在溢位或被零除的情況下,.NET 應拋出例外或至少回傳錯誤代碼或布林值(如 TryParse)。我想很多人都會同意,很難預料一個框架會回傳無窮大。這是因為在計算機科學...

    uj5u.com 2021-12-22 08:51:43 more
  • google.apis.people.v1.data.Source.updateTime缺失

    我正在嘗試獲取聯系人的上次更新時間資訊,但在 dotnet api 中它丟失了。反射源類代碼。所以我不能使用這篇文章中提到的代碼:Get no last modified timestamp when I request...

    uj5u.com 2021-12-22 08:36:29 more
  • “中間語言運行時”(不確定如何稱呼它)是否強制執行沒有派生類的密

    在 C# 中,您可以使類密封。那么您就不能將該類用作另一個類的基類。https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/sealed“中間語言運行時...

    uj5u.com 2021-12-22 08:34:58 more
  • C#正則運算式,檢查上一行是否有子模式THEN僅當子模式在同一行的左

    我想排除在上一行有“#-hide-”注釋的行,我可以修改這個腳本:(?m)^(?<!^#-hide-\r?\n). 而且我也想之間的“匹配文本func\s ”和“ s*\(”(即只匹配“函式名”出來的“FUNC函式...

    uj5u.com 2021-12-22 08:34:20 more
  • 如何同步運行異步列舉器方法并將其存盤為IEnumerable?

    我有一個使用 yield 回傳 IAsyncEnumerable 的異步方法。在某些情況下,可能需要同步獲取專案,因此我想為此創建另一種方法,通過同步運行現有方法回傳 IEnumerable 以避免重復代...

    uj5u.com 2021-12-22 08:33:47 more
  • 盡管已分配屬性,但模板中不存在該屬性

    我正在開發一個 Symfony 應用程式來向儀表添加儀表值。一個儀表可以有一組測量值,對于每個測量值,我想顯示一個值表來輸入值。為此,我在控制器中有一個函式,它ArrayCollection根...

    uj5u.com 2021-12-22 08:24:57 more
  • Omines資料表自定義查詢不起作用

    我正在使用捆綁包 Omines 在 Symfony 5 中創建資料表,并且我撰寫了一個自定義查詢。但是,當我這樣做時,視圖中的搜索不起作用。我該如何解決?這是我的代碼:控制器$table = $dataT...

    uj5u.com 2021-12-22 08:24:11 more