我们有这个方法:
async Task<int> AccessTheWebAsync()
{
HttpClient client = new HttpClient();
Task<string> getStringTask = client.GetStringAsync("http://msdn.microsoft.com");
// You can do work here that doesn't rely on the string from GetStringAsync.
DoIndependentWork();
string urlContents = await getStringTask;
//The thing is that this returns an int to a method that has a return type of Task<int>
return urlContents.Length;
}
Run Code Online (Sandbox Code Playgroud)
之间是否隐式转换发生Task<int>和int?如果没有,那么发生了什么?它是如何实现的?
在Scala中有一个Promise类,可用于手动完成Future.我正在寻找C#的替代品.
我正在编写测试,我希望它看起来与此类似:
// var MyResult has a field `Header`
var promise = new Promise<MyResult>;
handlerMyEventsWithHandler( msg =>
promise.Complete(msg);
);
// Wait for 2 seconds
var myResult = promise.Future.Await(2000);
Assert.Equals("my header", myResult.Header);
Run Code Online (Sandbox Code Playgroud)
我知道这可能不是C#的正确模式,但我无法找到一种合理的方法来实现同样的东西,即使是有些不同的模式.
编辑:请注意,这async//await没有帮助,因为我没有任务等待!我只能访问将在另一个线程上运行的处理程序.
我正在将我现有的(快速)iOS物理治疗应用程序"On My Nerves"重写为Xamarin.Forms.它是一个计时器应用程序,以帮助神经损伤的人(像我!)做脱敏练习.你有这些"面料"(例如羽毛),每个面料都有'x'秒倒计时.当织物的计时器达到0时,会出现一个消息框,显示"时间已到".用户点击OK,下一个结构开始倒计时.冲洗并重复列表中的所有织物.这是一个显示工作流程的视频.相信视频中的用户体验.
这是我的示例应用程序代码,演示了这种行为.
该DoSomethingForNow方法(原谅我的命名策略)是来自NotificationService的回调(参见第65行 - 没有足够的直接链接的SO重复点),这是在计时器启动时创建的,以防应用程序获得后台.
在设备上发布模式不起作用的特定呼叫位于第115行
Device.BeginInvokeOnMainThread(
async () => await ShowAlertAndWaitForUser(currentFabricCount));
Run Code Online (Sandbox Code Playgroud)
该async () => await ShowAlertAndWaitForUser(currentFabricCount))预期在调试和发布在iOS模拟器,并在设备的调试配置的配置工作.
但是,指示时间已启动的消息框未显示在物理设备上的Release config中.我无法弄清楚为什么Device.BeginInvokeOnMainThread()在设备上的Release配置中不起作用.到底是怎么回事?
侧边重新使用 Device.StartTimer()
之前我之所以切换 到James的FrenchPressTimer解决方案(请参阅jamesmontemagno/FrenchPressTimer)是因为我需要一种方法来取消/停止/无论用户需要暂停还是停止应用倒计时.Device.StartTimer() Device.StartTimer()
该 代码为我所有配置上都模拟器和设备的伟大工程,幸好有人告诉我如何取消Device.StartTimer(谢谢!).如果你想看到这个有用的解决方案,请在GitHub上查看saraford/Device-StartTimer-Working-Xamarin.Device.StartTimer()
我的具体问题是,Device.BeginInvokeOnMainThread()当物理设备上的Release config中的通知回调调用时,为什么不显示消息框.
我也尝试了不同的链接器组合.没有效果.
我一直在研究如何使用异步等待,但是当我们有多个互相调用的方法时,我不太了解它。我们应该始终使用等待还是仅在实际准备好使用结果时才使用等待?
因此,例如,我们应该这样做吗:
async Task<string[]> FooAsync()
{
var info = await Func1();
return info.split('.');
}
async Task<string> Func1()
{
return await Func2();
}
async Task<string> Func2()
{
return await tcpClient.ReadStringAsync();
}
Run Code Online (Sandbox Code Playgroud)
或像这样:
async Task<string[]> FooAsync()
{
var info = await Func1();
return info.split('.');
}
Task<string> Func1()
{
return Func2();
}
Task<string> Func2()
{
return tcpClient.ReadStringAsync();
}
Run Code Online (Sandbox Code Playgroud)
根据示例1,我们应该在每种方法中始终使用await吗?
还是
按照示例2,当我们开始使用结果时,我们应该只在最上面的方法上使用await吗?
我知道异步等待是如何工作的.我知道当执行到达等待时,它释放线程并在IO完成后,它从线程池中获取线程并运行剩余的代码.这样就可以有效地利用线程.但我在一些用例中感到困惑:
简介:在库方法中,何时应该使用async和await关键字而不是Task直接返回?
我相信我的问题与此问题有关.但是,这个问题是关于.NET 4.0和TPL,而我正在使用.NET 4.6 async和await关键字.所以,我认为我的问题可能得到不同的答案,因为在回答链接问题时这些关键字不存在.
说明:我正在为外部WCF服务编写一个简单的包装器,并且包装器会进行多次SendAsync调用.现在我认为每个包装器方法都应该直接返回Task<>,而不必等待.我的理解是async/ await应该在应用层上使用,而不是在库中.
因此,例如,我认为我应该为每个包装器方法采用的方法:
private Task<SignResponse> GetSignDataAsync(SigningRequestType request)
{
return _service.SendAsync(request);
}
Run Code Online (Sandbox Code Playgroud)
但是在互联网上,我找到了几个使用这种方法的帖子:
private async Task<SignResponse> GetSignDataAsync(SigningRequestType request)
{
return await _service.SendAsync(request).ConfigureAwait(false);
}
Run Code Online (Sandbox Code Playgroud)
这是我在technet上找到的另一个例子:
async Task PutTaskDelay()
{
await Task.Delay(5000);
}
private async void btnTaskDelay_Click(object sender, EventArgs e)
{
await PutTaskDelay();
MessageBox.Show("I am back");
}
Run Code Online (Sandbox Code Playgroud)
那么,我何时应该使用第二种方法(包含 …
我有一个IAnimation暴露方法的接口BeginAsync().该方法应该启动动画并在完成时返回.
我想要做的是实现一个只在执行时返回的null动画类.NoAnimationBeginAsync()
这是正确的实施吗?
public async Task BeginAsync()
{
await Task.Run(() => { });
}
Run Code Online (Sandbox Code Playgroud)
我怀疑有一种比这更优雅的方法.我还考虑过创建一个空方法.但这给了我一个我不喜欢的警告.
我正在使用带有EF-6的asp.net MVC-5,我不确定使用await + ToListAsync是否有效.例如,我有以下存储库方法,它返回IQueryable: -
public IQueryable<TSet> getAllScanEmailTo()
{
return t.TSets.Where(a=>a.Name.StartsWith("ScanEmail"));
}
Run Code Online (Sandbox Code Playgroud)
我称之为: -
var emailsTo = await repository.getAllScanEmailTo().ToListAsync();
Run Code Online (Sandbox Code Playgroud)
一开始,我以为我会得到一个错误,因为我正在使用"等待"一个未被定义为任务的方法,但上面工作得很好,所以有人可以就此提出建议吗?
c# asynchronous async-await entity-framework-6 asp.net-mvc-5
我正在制作一个 python 网络抓取脚本。我应该使用 asyncio 来完成此操作。因此,对于异步 HTTP 请求,我使用 AioHTTP。
没关系,但是当我尝试制作一个非阻塞应用程序(等待)时,beautifulsoup4将阻止应用程序(因为beautifulsoup4不支持异步)
这就是我尝试过的。
import asyncio, aiohttp
from bs4 import BeautifulSoup
async def extractLinks(html):
soup = BeautifulSoup(html, 'html.parser')
return soup.select(".c-pro-box__title a")
async def getHtml(session, url):
async with session.get(url) as response:
return await response.text()
async def loadPage(url):
async with aiohttp.ClientSession() as session:
html = await getHtml(session, url)
links = await extractLinks(html)
return links
loop = asyncio.get_event_loop()
loop.run_until_complete(loadPage())
Run Code Online (Sandbox Code Playgroud)
将extractLinks()阻止程序流。
那么这是否可以使其成为非阻塞呢?或者除了 beautifulsoup4 之外还有其他库可以尽可能支持异步吗?
我一直在尝试使用教程,但似乎无法弄清楚如何使用 Promise 或异步等待。
我有一个 http GET 请求,我想在返回之前等待 API 的结果。返回 null 因为函数在 GET 发生之前返回。
获取
get_UserAccess(practiceId: number, userId: number): UserAccess {
var d: UserAccess;
this.httpclient.get(this.URL).subscribe.(data => {
d = data as UserAccess;
});
return d; //Keeps returning as null
Run Code Online (Sandbox Code Playgroud)
调用组件
var userAccess = this.dataService.get_UserAccess(this.practice.practiceId, this.users[i].userId);
this.loadAccess(userAccess);
Run Code Online (Sandbox Code Playgroud)
我已经尝试将 await 和 async 标签添加到 get 请求中,但我不确定如何处理它返回给调用组件的承诺。