[英]How to limit the number of active Tasks running via the Parallel Task Library?
[英]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.