相关疑难解决方法(0)

为什么使用HttpClient进行同步连接

我正在构建一个类API来与API进行交互.我需要调用API并处理XML响应.我可以看到HttpClient用于异步连接的好处,但我正在做的是纯粹的同步,所以我看不到使用它的任何重大好处HttpWebRequest.

如果有人可以放弃任何光线,我将非常感激.我不是为了它而使用新技术的人.

c# asp.net dotnet-httpclient

173
推荐指数
7
解决办法
14万
查看次数

并行运行两个异步任务并在.NET 4.5中收集结果

我已经尝试了一段时间来获得一些我认为可以简单地使用.NET 4.5的东西

我想同时启动两个长时间运行的任务,并
以最佳的C#4.5(RTM)方式收集结果

以下作品,但我不喜欢它,因为:

  • 我想Sleep成为一个异步方法,所以它可以是await其他方法
  • 它看起来很笨拙 Task.Run()
  • 我认为这甚至根本不使用任何新的语言功能!

工作代码:

public static void Go()
{
    Console.WriteLine("Starting");

    var task1 = Task.Run(() => Sleep(5000));    
    var task2 = Task.Run(() => Sleep(3000));

    int totalSlept = task1.Result + task2.Result;

    Console.WriteLine("Slept for a total of " + totalSlept + " ms");
}

private static int Sleep(int ms)
{
    Console.WriteLine("Sleeping for " + ms);
    Thread.Sleep(ms);
    Console.WriteLine("Sleeping for " + ms + " FINISHED");
    return ms;
}
Run Code Online (Sandbox Code Playgroud)

非工作代码:

更新:这实际上是有效的,并且是正确的方法,唯一的问题是 Thread.Sleep

此代码不起作用,因为调用Sleep(5000)立即启动任务运行,因此Sleep(1000) …

c# asynchronous task-parallel-library .net-4.5

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

为什么我懒得使用Task.ConfigureAwait(continueOnCapturedContext:false);

请考虑以下Windows窗体代码:

private async void UpdateUIControlClicked(object sender, EventArgs e)
    {
        this.txtUIControl.Text = "I will be updated after 2nd await - i hope!";
        await Task.Delay(5000).ConfigureAwait(continueOnCapturedContext: false);
        this.txtUIControl.Text = "I am updated now.";
    }
Run Code Online (Sandbox Code Playgroud)

这里异常是在第3行引发的,因为在等待代码在非UI线程上执行之后.ConfigureAwait(false)有用吗?

c# synchronizationcontext async-await

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

await task.run vs await c#

我在网上搜索过,看过很多关于task.run和等待异步的问题,但是有一个特定的使用场景,我并不是真的了解它的区别.我相信情景非常简单.

await Task.Run(() => LongProcess());
Run Code Online (Sandbox Code Playgroud)

VS

await LongProcess());
Run Code Online (Sandbox Code Playgroud)

其中LongProcess是一个异步方法,其中包含一些异步调用,例如调用db并等待ExecuteReaderAsync().

题:

这种情况下两者之间有什么区别吗?感谢任何帮助或意见,谢谢!

c# asynchronous async-await

14
推荐指数
3
解决办法
8178
查看次数

如何从头开始实现异步I/O绑定操作?

我试图了解如何以及何时使用async编程并进行I/O绑定操作,但我不理解它们.我想从头开始实现它们.我怎样才能做到这一点?

考虑下面的同步示例:

private void DownloadBigImage() {
    var url = "https://cosmos-magazine.imgix.net/file/spina/photo/14402/180322-Steve-Full.jpg";
    new WebClient().DownloadFile(url, "image.jpg");
}
Run Code Online (Sandbox Code Playgroud)

我如何async通过只使用正常的同步方法DownloadBigImage Task.Run实现该版本而不使用,因为这将仅使用线程池中的线程进行等待 - 这只是浪费!

不要使用已经有的特殊方法async!这就是这个问题的目的:如何在不依赖已经异步的方法的情况下自己制作它?所以,没有像这样的事情:

await new WebClient().DownloadFileTaskAsync(url, "image.jpg");
Run Code Online (Sandbox Code Playgroud)

在这方面非常缺乏可用的示例和文档.我发现只有这个:https: //docs.microsoft.com/en-us/dotnet/standard/async-in-depth ,其中说:

对GetStringAsync()的调用通过较低级别的.NET库(可能调用其他异步方法)调用,直到它到达本机网络库的P/Invoke互操作调用.本机库随后可以调用System API调用(例如对Linux上的套接字的write()).将在本机/托管边界创建任务对象,可能使用TaskCompletionSource.任务对象将通过层传递,可能在操作或直接返回,最终返回到初始调用者.

基本上我必须使用" P/Invoke互操作调用到本机网络库 "......但是如何?

c# asynchronous async-await

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

Task.Run应该如何在VB.NET中调用异步方法?

给定一个同时执行CPU和IO工作的异步方法,例如:

Public Async Function RunAsync() As Task
    DoWork()
    Await networkStream.WriteAsync(buffer, 0, buffer.Length).ConfigureAwait(False)
End Function
Run Code Online (Sandbox Code Playgroud)

以下哪个选项是从Visual Basic中的Task.Run调用该异步方法的最佳方法,为什么?

哪个是C#的VB等价物Task.Run(() => RunAsync())

Await Task.Run(Function() RunAsync())
' or
Await Task.Run(Sub() RunAsync())
Run Code Online (Sandbox Code Playgroud)

Task.Run中的Async/Await关键字是必要还是冗余?该评论声称它们是多余的,但这个答案表明在某些情况下可能是必要的:

Await Task.Run(Async Function()
                   Await RunAsync()
               End Function)
Run Code Online (Sandbox Code Playgroud)

ConfigureAwait在Task.Run中是否有用?

Await Task.Run(Function() RunAsync().ConfigureAwait(False))

Await Task.Run(Async Function()
                   Await RunAsync().ConfigureAwait(False)
               End Function)
Run Code Online (Sandbox Code Playgroud)

以上哪5个Task.Run选项是最佳实践?

注意:有一个类似的问题如何在Task.Run中调用异步方法?但它适用于C#,所选答案具有否定投票,并且不涉及ConfigureAwait.

vb.net async-await

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

C#Web API在HTTP Post REST客户端中发送正文数据

我需要发送以下HTTP发布请求:

 POST https://webapi.com/baseurl/login
 Content-Type: application/json

 {"Password":"password",
 "AppVersion":"1",
 "AppComments":"",
 "UserName":"username",
 "AppKey":"dakey" 
  }
Run Code Online (Sandbox Code Playgroud)

就像上面一样,它在RestClient和PostMan中也很好用。

我需要在语法上做到这一点,并且不确定是否要使用

WebClient,HTTPRequest或WebRequest可以完成此任务。

问题是如何格式化正文内容并在请求中将其发送到上方。

这是我使用WebClient的示例代码的地方...

  private static void Main(string[] args)
    {
        RunPostAsync();
    } 

    static HttpClient client = new HttpClient();

    private static void RunPostAsync(){

            client.DefaultRequestHeaders.Accept.Clear();
            client.DefaultRequestHeaders.Accept.Add(
                new MediaTypeWithQualityHeaderValue("application/json"));

            Inputs inputs = new Inputs();

            inputs.Password = "pw";
            inputs.AppVersion = "apv";
            inputs.AppComments = "apc";
            inputs.UserName = "user";
            inputs.AppKey = "apk";


            var res = client.PostAsync("https://baseuriplus", new StringContent(JsonConvert.SerializeObject(inputs)));

            try
            {
                res.Result.EnsureSuccessStatusCode();

                Console.WriteLine("Response " + res.Result.Content.ReadAsStringAsync().Result + Environment.NewLine);

            }
            catch (Exception ex)
            {
                Console.WriteLine("Error " …
Run Code Online (Sandbox Code Playgroud)

c# asp.net-web-api advanced-rest-client asp.net-core

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

运行异步 Foreach 循环 C# async await

我正在努力掌握 c# async await 的基本概念。

基本上,我拥有的是一个我需要处理的对象列表,处理过程涉及遍历其属性并连接字符串,然后创建一个新对象(在这种情况下称为 trellocard)并最终添加一个 trellocard 列表。

迭代需要很长时间,所以我想做的是异步处理多个对象。

我尝试了多种方法,但基本上我想做这样的事情。(在下面的例子中,我已经删除了处理,只是把 system.threading.thread.sleep(200)。我等待这不是一个异步方法,我可以使用 tasks.delay 但重点是我的处理没有有任何异步方法,我只想用多个实例运行整个方法。

    private async Task<List<TrelloCard>> ProcessJobs(IQueryable<IGrouping<CardGrouping, Job>> jobs)
    {
        List<TrelloCard> cards = new List<TrelloCard>();

        foreach (var job in jobs.ToList())
        {
           card = await ProcessCards(job, cards);  // I would like to run multiple instances of the processing
           cards.add(card); //Once each instance is finshed it adds it to the list
        }


  private async Task<TrelloCard> ProcessCards(Job job)
    {
        System.Threading.Thread.Sleep(2000);  //Just for examples sake

        return new TrelloCard();
    }
Run Code Online (Sandbox Code Playgroud)

c# asynchronous async-await

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

使用 Xamarin Android 版本 8、.net 标准运行或不运行包含服务和活动的 ConfigureAwait(false)

我遇到了以下有关何时何地使用的文章ConfigureAwait(false),但无法得到答案。

您不需要 ConfigureAwait(false),但仍可在库和 UI 应用程序中使用它。(例如 Xamarin、WinForms 等)

https://blog.stephencleary.com/2017/03/aspnetcore-synchronization-context.html

此链接说相反的答案

为所有服务器端代码调用 ConfigureAwait 的最佳实践

正确使用 Task.Run 和 async-await 时

我的问题:

场景 1:下面的代码作为后台服务运行。

我的问题:ConfigureAwait(false)无论何时await都需要像下面的 A 和 B 一样使用:

    [Service(Name = "com.MainApplicationService", Label = "Main Application Service", Exported = false)]
    public class MainApplicationService : Android.App.Service
    {

        public override IBinder OnBind(Intent intent)
        {
            return null;
        }

        [return: GeneratedEnum]
        public override StartCommandResult OnStartCommand(Intent intent, [GeneratedEnum] StartCommandFlags flags, int startId)
        {
            await InitAsync().ConfigureAwait(false);   //line A

            Task.Run(async () => await …
Run Code Online (Sandbox Code Playgroud)

c# task-parallel-library xamarin.android async-await xamarin

5
推荐指数
1
解决办法
736
查看次数

使用Async/Await重写我的Utils库的正确方法

我有许多Utils类,我用于许多不同的项目,其中大多数是静态的,并且由静态方法构成,通常甚至不会相互调用.

我的目的是利用新的async/await功能,但不重写所有内容,所以我的问题是:我可以使用Task.Run(()=> MethodName)为每个名为MethodAsync的现有方法添加一个新方法吗?

例:

//old code that will not be removed
static void DoSomething()
{ ... }

//new code that will be added
static async Task DoSomethingAsync()
{
   //not really sure if Im supposed to use await/async here.
   //isn't Task awaitable even without async??
   return await Task.Run(() => DoSomething());
}
Run Code Online (Sandbox Code Playgroud)

基本上在旧代码中我只有一个普通的同步方法,而在新代码中,我有一个异步方法,如果CLR将其视为CPU绑定方法,它甚至可以在另一个线程中运行.

如果我正确理解,每个异步方法都按定义包含等待一个等待的对象,这是一个Task或另一个异步方法.

这意味着每当我可以使用异步.NET方法时,我应该等待它并将我的调用方法标记为异步.

但是,应该使用Task.Run调用调用其他每个不调用任何异步方法但可能需要一些时间才能完成的方法.

对?

编辑

所以我已经阅读了所有发布的链接,msdn上的最佳实践和一些博客文章,但是在使用新的async/await功能进行编码时,我还需要一个完整的例程.这是我到目前为止所得到的:

1)每个具有异步备选方案的.NET方法都应该使用异步备选方法.(据我所知,.NET异步方法仅适用于可以异步的方法).

2)每个使用异步方法的方法也应该是异步的.

3)每个不使用异步方法的方法(因为没有可用)但仍然需要一些cpu-time来执行应该通过使用Task.Run包装来实现异步(我知道在这种情况下它应该是客户端如果他们想要使用Task.Run,​​但由于我只为执行时间超过50ms的方法添加这些包装器,并且仍然可以使用该方法的非异步版本,我仍然不明白为什么我不应该将此包装器放在库中).

4)每个采用非cpu-time的方法导致它等待其他源(如Internet,数据库,事件等)应该使用TaskFactory.FromAsync或TaskCompletionSource.

5)System.Threading.Tasks.Parallel.Invoke(method1,method2等等)现已弃用.从我读到的内容,如果CLR认为需要并发,Task.Run已经运行并发线程.因此,似乎Task.Run在需要时已经使用了Parallel.Invoke.

c# asynchronous async-await

4
推荐指数
2
解决办法
1848
查看次数

wait 仍然阻塞当前 UI 线程

我尝试使用以下代码在线程池中运行某些任务:

private async void button1_Click(object sender, EventArgs e)
{
   await test().ConfigureAwait(continueOnCapturedContext: false);
}
private Task test()
{
   Thread.Sleep(100000);
   return null;
}
Run Code Online (Sandbox Code Playgroud)

该代码应该在线程池中运行,但是当前的 UI 线程仍然被阻塞。

那么有人可以帮忙看一下吗?谢谢,

c# asynchronous async-await

3
推荐指数
1
解决办法
3130
查看次数

如何在Main中正确调用Await方法?

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace TaskConsole
{
    class Program
    {
        static void Main(string[] args)
        {       
             test();    
        }

        static async Task<string> ReadTextAsync() 
        {
            string textContents;
            Task<string> readFromText;

            using (StreamReader reader =  File.OpenText("email.txt"))
            {
                readFromText = reader.ReadToEndAsync();
                textContents = await readFromText;

            }

            return textContents;     
        }

        static async Task test ()
        {
            string capture = await ReadTextAsync();
            Console.WriteLine(capture);
        }               
    }               
}
Run Code Online (Sandbox Code Playgroud)

我有以下代码使用async从文本文件中读取.我从这篇文章中了解到,微软使用StreamReader实现的例子不正确,所以作为一个学习练习,我决定纠正它.当测试方法不返回任何任务时,如何从main正确调用测试方法.我做了一点阅读,并了解到使用async void是不好的做法.在我的情况下,我该怎么办?

旁注:我不知道我是否实施错误,但我无法显示我的文字.我尝试了非异步方式,但是,当我使用async时,它显示为空白,请按任意键继续"

c# asynchronous async-await

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

任务<T>撤销结果的扩展方法

想知道,使用扩展方法是否会有任何问题Task<T>:

public static T Await<T>(this Task<T> task)
{
    var result = default(T);

    Task.Run(async () => result = await task).Wait();

    return result;
}
Run Code Online (Sandbox Code Playgroud)

对于那些你希望从a获得结果的实例来说,这似乎是一个不错的节省时间,Task但是你的方法没有标记async.

c# extension-methods task async-await

0
推荐指数
1
解决办法
1769
查看次数