欢迎访问www.allbetgaming.com!

首页科技正文

泰州景点:并发系列64章(异步编程)第二章

admin2020-04-0849

前言

异步编程的观点我在第一章提要的时刻,提及了。在此再次简略提要一次。

它接纳future模式或者回调模式机制,以制止发生不必要的线程。

异步编程测试的尺度

在第一个写这个的缘故原由,是由于测试可能比开发主要。由于在开发一个项目的时刻呢?有一个自动化高效精准测试,决议了上线是否稳固。由于程序出bug测试出来可以改,方案不行换方案,然则测试不行上线了。这时刻面临的问题就比较大,由于这时刻发生了数据。

好比说 app 一张表的设计不合理,在自动化测试中没有体现出来,那么你要替换表的时刻就显得异常难题,这时刻到底换不换表的结构呢?换了之后,若何兼容之前的版本?迭代的方案是啥。好的,扯得很远了。

固然我们作为开发人员也要做好单元测试,及子系统测试。好的,近了一点了。

我们在写一个异步程序的时刻,是有3个测试必须通过。

1.同步乐成

2.异步乐成

3.异步失败

先先容一下若何异步测试:

public static async Task<T> DelayResult<T>(T result, TimeSpan delay)
{
	await Task.Delay(delay);
	return result;
}

若何测试的时刻若是这样写:

[Fact]
public async void Test1()
{
	TimeSpan timeSpan = new TimeSpan();
	Program.DelayResult<int>(1, timeSpan);
}

那么这个测试是有问题的。
好比:

public static async Task<T> DelayResult<T>(T result, TimeSpan delay)
{
	await Task.Delay(delay);
	throw new Exception("error");
	return result;
}

原本我是应该抛出异常的,然则:

效果是下面这样的。
缘故原由就涉及到一个异常捕捉的问题了,可以查询一下原理。
运行测试的时刻应该加上await:

[Fact]
public async void Test1()
{
	TimeSpan timeSpan = new TimeSpan();
	await Program.DelayResult<int>(1, timeSpan);
}


那么这个时刻就可以捕捉到异常。

下面先容一些例子。

指数退避

这个是什么意思呢?好比说,我们接见我们的一条url的时刻,接见失败。
接下来我们应该做的是重试,那么是否马上重试?不是的,除非是壅闭式的api挪用,例如登录。
然则呢,若是不是壅闭式的,那么应该把资源分配平衡。由于你一次失败,第二次的也有可能失败。
那么这时刻指数退避是一种优越的方式。

static async Task<string> visitUrl(string url)
{
	using (var client = new HttpClient())
	{
		var nextDelay = TimeSpan.FromSeconds(1);
		for (int i = 0; i != 3; ++i)
		{
			try
			{
				return await client.GetStringAsync(url);
			}
			catch
			{

			}
			await Task.Delay(nextDelay);
			nextDelay = nextDelay + nextDelay;
		}
		// 返回最后的效果利便得出错误
		return await client.GetStringAsync(url);
	}
}

测试:

[Fact]
public async void Test1()
{
	await Program.visitUrl("www.xxx.com");
}

效果:

测试花了7秒。
准确验证测试我就意外了。

实现超时功效

上面的这个代码,我们发现一个问题啊,若是接见谁人链接要很久,那么这也很受伤啊。
是否能加入一个超时,若是接见一段时间没有返回效果,那么把资源留给其余需求者。

public static async Task<string> visitTimeoutUrl(HttpClient client,string url)
{
	var visitTask=client.GetStringAsync(url);
	var timeoutTask = Task.Delay(3000);
	var completedTask = await Task.WhenAny(visitTask,timeoutTask);
	if (completedTask == timeoutTask)
	{
		return null;
	}
	return await visitTask;
}

上文实现了一个简朴的超时。
然后改一下:

public static async Task<string> visitUrl(string url)
{
	using (var client = new HttpClient())
	{
		var nextDelay = TimeSpan.FromSeconds(1);
		for (int i = 0; i != 3; ++i)
		{
			try
			{
				var result= await visitTimeoutUrl(client,url);
				if (result != null)
				{
					return result;
				}
			}
			catch
			{

			}
			await Task.Delay(nextDelay);
			nextDelay = nextDelay + nextDelay;
		}
		// 返回最后的效果利便得出错误
		return await visitTimeoutUrl(client, url);
	}
}

未完

今天写博客的时刻,一直泛起error,就先到这吧。
下一章,照样几个例子感受一下。以上为小我私家明白,若有不对望请指出。

,

Sunbet

www.0379st.com信誉来自于每一位客户的口碑,Sunbet贴心的服务,让你尊享贵宾通道,秒速提现,秒速到账,同行业中体验最佳。

转载声明:本站发布文章及版权归原作者所有,转载本站文章请注明文章来源!

本文链接:https://www.juneview.com/post/677.html

网友评论

最新评论

  • 环球UG注册 09/18 说:

    欧博allbet网址欢迎进入欧博allbet网址(Allbet Game):www.aLLbetgame.us,欧博官网是欧博集团的官方网站。欧博官网开放Allbet注册、Allbe代理、Allbet电脑客户端、Allbet手机版下载等业务。感觉还可以,继续追。

  • 环球UG注册 09/18 说:

    欧博allbet网址欢迎进入欧博allbet网址(Allbet Game):www.aLLbetgame.us,欧博官网是欧博集团的官方网站。欧博官网开放Allbet注册、Allbe代理、Allbet电脑客户端、Allbet手机版下载等业务。感觉还可以,继续追。

  • 皇冠体育APP 09/18 说:

    欧博开户网址欢迎进入欧博开户网址(Allbet Gaming):www.aLLbetgame.us,欧博网址开放会员注册、代理开户、电脑客户端下载、苹果安卓下载等业务。下笔如有神

  • UG环球网址 09/18 说:

    AllbetGmaing电脑版下载欢迎进入AllbetGmaing电脑版下载(www.aLLbetgame.us):www.aLLbetgame.us,欧博官网是欧博集团的官方网站。欧博官网开放Allbet注册、Allbe代理、Allbet电脑客户端、Allbet手机版下载等业务。反正我跪了

  • UG环球客户端 09/18 说:

    Allbet Gmaing欢迎进入欧博Allbet官网(www.aLLbetgame.us):www.aLLbetgame.us,欧博官网是欧博集团的官方网站。欧博官网开放Allbet注册、Allbe代理、Allbet电脑客户端、Allbet手机版下载等业务。我也来看

  • UG环球官网 09/17 说:

    ALLBET官网娱乐平台开户欢迎进入ALLBET官网娱乐平台开户:www.aLLbetgame.us,欧博官网是欧博集团的官方网站。欧博官网开放Allbet注册、Allbe代理、Allbet电脑客户端、Allbet手机版下载等业务。有趣

  • 皇冠APP下载 09/17 说:

    AllbetGmaing手机版下载欢迎进入AllbetGmaing手机版下载(www.aLLbetgame.us):www.aLLbetgame.us,欧博官网是欧博集团的官方网站。欧博官网开放Allbet注册、Allbe代理、Allbet电脑客户端、Allbet手机版下载等业务。想交读友

  • UG环球手机版下载 09/17 说:

    欧博注册欢迎进入欧博注册(Allbet Game):www.aLLbetgame.us,欧博官网是欧博集团的官方网站。欧博官网开放Allbet注册、Allbe代理、Allbet电脑客户端、Allbet手机版下载等业务。好多人都看啊