我有以下扩展方法来监控一个变量,并等待直到它具有给定的预期值:
问题在于我找不到一种合适的方式来正确定义
理想情况下,它应该看起来像这样:。
public static async Task AwaitForValue<T>(this Func<T> valueGetter, T expectedValue, int? millisecondsToAwaitBetweenChecks = null, int? maxMillisecondsToAwait = null)
where T : struct
{
var timeToAwait = millisecondsToAwaitBetweenChecks ?? 20;
if (maxMillisecondsToAwait.HasValue)
{
var stopWatch = new Stopwatch();
stopWatch.Start();
while (!valueGetter().Equals(expectedValue) || stopWatch.ElapsedMilliseconds >= maxMillisecondsToAwait)
{
await Task.Delay(timeToAwait);
}
}
else
{
while (!valueGetter().Equals(expectedValue))
{
await Task.Delay(timeToAwait);
}
}
}
它很正常地工作:
class Foo
{
private bool _flag;
public async void DoWork()
{
Task.Run(() =>
{
Thread.Sleep(5000);
_flag = true;
});
await new Func<bool>(() => _flag).AwaitForValue(true);
Console.WriteLine(_flag);
}
}
我想定义一个ref扩展方法,它可以提供一个委托来返回ref变量的当前值,类似于:
public delegate ref T RefFunc<T>();
这种方式可以扩展RefFunc<T>
而不是Func<T>
,并且可以像下面这样使用:
_flag.ToRefFunc().AwaitForValue(true);
问题在于我找不到一种合适的方式来正确定义
ToRefFunc<T>(this ref T value);
,因为lambda表达式中不允许使用ref
。是否有一种方法来定义以下方法?public static RefFunc<T> ToRefFunc<T>(this ref T value) where T : struct
{
//todo some day
}
理想情况下,它应该看起来像这样:。
public static RefFunc<T> ToRefFunc<T>(this ref T value) where T : struct => new RefFunc<T>(() => value);
任何帮助都将不胜感激
编辑
问题并不在于是否允许使用ref扩展方法,可以从“重复”问题中参见此处
编辑2 匿名委托语法也不起作用:
public static RefFunc<T> ToRefFunc<T>(this ref T value) where T: struct
{
return delegate { return value; };
}
我收到的错误信息是:无法在匿名方法、Lambda表达式、查询表达式或局部函数中使用ref、out或in参数'value'