相关疑难解决方法(0)

Task <int>如何成为一个int?

我们有这个方法:

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?如果没有,那么发生了什么?它是如何实现的?

.net c# asynchronous c#-5.0 .net-4.5

101
推荐指数
2
解决办法
9万
查看次数

承诺相当于C#

在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没有帮助,因为我没有任务等待!我只能访问将在另一个线程上运行的处理程序.

c# future task promise async-await

57
推荐指数
4
解决办法
4万
查看次数

在Xamarin.Forms中,Device.BeginInvokeOnMainThread()不会在物理设备上的Release config中显示来自通知回调**的消息框

我正在将我现有的(快速)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中的通知回调调用时,为什么不显示消息框.

我也尝试了不同的链接器组合.没有效果.

c# xamarin xamarin.forms

40
推荐指数
1
解决办法
1436
查看次数

我们应该如何使用异步等待?

我一直在研究如何使用异步等待,但是当我们有多个互相调用的方法时,我不太了解它。我们应该始终使用等待还是仅在实际准备好使用结果时才使用等待?

因此,例如,我们应该这样做吗:

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吗?

c# asynchronous async-await

40
推荐指数
2
解决办法
3085
查看次数

异步等待增加上下文切换

我知道异步等待是如何工作的.我知道当执行到达等待时,它释放线程并在IO完成后,它从线程池中获取线程并运行剩余的代码.这样就可以有效地利用线程.但我在一些用例中感到困惑:

  1. 我们是否应该使用异步方法来实现非常快速的IO方法,比如缓存读/写方法?它们不会导致不必要的上下文切换.如果我们使用sync方法,则执行将在同一线程上完成,并且上下文切换可能不会发生.
  2. Async-await是否仅保存内存消耗(通过创建较少的线程).或者它也节省了CPU?据我所知,在同步IO的情况下,当IO发生时,线程进入睡眠模式.这意味着它不消耗CPU.这种理解是否正确?

c# multithreading asynchronous async-await

15
推荐指数
2
解决办法
4142
查看次数

始终在库中的异步方法中使用"async"和"await"关键字?

简介:在库方法中,何时应该使用asyncawait关键字而不是Task直接返回?

我相信我的问题与问题有关.但是,这个问题是关于.NET 4.0和TPL,而我正在使用.NET 4.6 asyncawait关键字.所以,我认为我的问题可能得到不同的答案,因为在回答链接问题时这些关键字不存在.

说明:我正在为外部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)

那么,我何时应该使用第二种方法(包含 …

.net c# asynchronous async-await .net-4.6

14
推荐指数
1
解决办法
2163
查看次数

什么都不做的异步方法

我有一个IAnimation暴露方法的接口BeginAsync().该方法应该启动动画并在完成时返回.

我想要做的是实现一个只在执行时返回的null动画类.NoAnimationBeginAsync()

这是正确的实施吗?

public async Task BeginAsync()
{
    await Task.Run(() => { });
}
Run Code Online (Sandbox Code Playgroud)

我怀疑有一种比这更优雅的方法.我还考虑过创建一个空方法.但这给了我一个我不喜欢的警告.

.net c# asynchronous task async-await

12
推荐指数
1
解决办法
3922
查看次数

如果我在IQueryable上使用await + ToListAsync()并且未定义为任务,那么它是否正确?

我正在使用带有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

11
推荐指数
2
解决办法
2万
查看次数

在 Python 中使用 Beautifulsoup4 进行异步 HTML 解析

我正在制作一个 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 之外还有其他库可以尽可能支持异步吗?

python asynchronous beautifulsoup

8
推荐指数
1
解决办法
3671
查看次数

Angular 8 - 如何使用 Promise 和 Async/Await

我一直在尝试使用教程,但似乎无法弄清楚如何使用 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 请求中,但我不确定如何处理它返回给调用组件的承诺。

async-await angular-promise angular

7
推荐指数
2
解决办法
3万
查看次数