簡體   English   中英

通過任務並行庫創建任務時在lambda中使用'out'

[英]Using 'out' within lambdas when creating Tasks via Task Parallel Library

我有以下無法編譯的代碼。 我得到錯誤

無法在匿名方法,lambda表達式或查詢表達式中使用ref或out參數'messageLockToken'

我承認我是Lambdas的新手,對解決這個問題有些困惑。 有誰知道我如何以編譯器可接受的方式表達以下邏輯?

public T Receive<T>(TimeSpan receiveTimeout, out Guid messageLockToken)
{
    // do work
}

public Task<T> ReceiveAsync<T>(TimeSpan receiveTimeout, out Guid messageLockToken)
{
    Task<T> sendQueueMsgTask = new Task<T>(() => Receive<T>(receiveTimeout, out messageLockToken));
    return sendQueueMsgTask;
}

首先,即使已編譯,您的方法也無法使用。 這是因為當您使用new Task() ,始終必須在該Task上調用Start() (或者使用Task.Run() )。

現在,您不能在此處使用out參數,因為它沒有太大意義。 您想立即從方法中返回Task ,但這也意味着立即返回Guid 這意味着您對Receive()調用實際上無法影響out參數的值。

我認為使用Tuple (如Rawling所建議的)或自定義返回類型是前往此處的方法:

public Task<Tuple<T, Guid>> ReceiveAsync<T>(TimeSpan receiveTimeout)
{
    return Task.Run(
        () =>
        {
            Guid messageLockToken;
            var result = Receive<T>(receiveTimeout, out messageLockToken);
            return Tuple.Create(result, messageLockToken);
        });
}

假設您確實要執行此操作,請參閱Stephen Toub的文章我應該為異步方法公開異步包裝器嗎? 由於某些原因,這樣做可能不是一個好主意。

由於您不能在此處使用out參數,因此可以:

  • 返回Tuple<T, Guid> (或使用自定義的通用類),或
  • 傳遞一個Action<Guid>而不是out Guid (因此ReceiveAsync(ts, out myGuid)您將調用ReceiveAsync(ts, g => myGuid = g)而不是ReceiveAsync(ts, out myGuid) ReceiveAsync(ts, g => myGuid = g)

(我認為您沒有任何方法可以解決此問題,仍然向調用方公開out參數;應該在該方法返回時填充out參數,但是在您的情況下情況並非如此。)

暫無
暫無

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

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