簡體   English   中英

我不知道如何填充列表<string>在 c# 任務中正確</string>

[英]I can't figure out how to populate a List<string> inside a c# Task correctly

我寫這個荒謬的代碼只是為了弄清楚:

  • 如果我使用CallingFunctionAsync_v1CallingFunctionAsync_v2有區別嗎?

如果是這樣,有人可以解釋為什么嗎?

定義:

class WorkHorse
{
    const int RECORD_SIZE = 12;

    public async Task<List<string>> DoTheThingAsync_v1(CancellationToken cancellationToken)
    {

        List<string> theList = new List<string>();

        byte[] buffer = new byte[RECORD_SIZE];

        using var fs = File.OpenRead("awesome_stuff.bin");
        int read;
        while ((read = await fs.ReadAsync(buffer, 0, RECORD_SIZE, cancellationToken).ConfigureAwait(false)) != 0)
        {
            theList.Add(Encoding.UTF8.GetString(buffer, 0, RECORD_SIZE));
        }

        return theList;
    }

    public async Task DoTheThingAsync_v2(List<string> theList, CancellationToken cancellationToken)
    {
        byte[] buffer = new byte[RECORD_SIZE];

        using var fs = File.OpenRead("awesome_stuff.bin");
        int read;
        while ((read = await fs.ReadAsync(buffer, 0, RECORD_SIZE, cancellationToken).ConfigureAwait(false)) != 0)
        {
            theList.Add(Encoding.UTF8.GetString(buffer, 0, RECORD_SIZE));
        }
    }
}

用法:

class FunTimes
{
    List<string> TheStrings;

    public async Task CallingFunctionAsync_v1(CancellationToken cancellationToken)
    {
        this.TheStrings = await new WorkHorse().DoTheThingAsync_v1(cancellationToken).ConfigureAwait(false);
    }

    public Task CallingFunctionAsync_v2(CancellationToken cancellationToken)
    {
        this.TheStrings = new List<string>();
        return new WorkHorse().DoTheThingAsync_v2(this.TheStrings, cancellationToken);
    }

}

V1 是更好的方法。 它是一個純粹的黑盒 function,它總是返回一個新列表。

V2 需要一個List<string>的初始化實例,這很容易出錯。 您可以輕松通過 null 並遇到問題。 然后,由於這些是異步方法,您可以同時運行 V2,並且您將在已通過的列表上出現競爭條件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM