• 全部
  • C#综合技术
  • C#互联网桌面应用
  • AppLauncher
  • WinForm&WPF
  • C#开发新技术
  • 问答

C#异步怎么写?想实现弹窗的时候调用web服务

qq_17386267 2020-10-23 11:57:48



在另一个方法里这样调用可以吗 主要实现调用的时候加载等待窗口
this.splashScreenManager1.ShowWaitForm();

Task<string> xmlstring = GetPatientList(pid);

this.splashScreenManager1.CloseWaitForm();
...全文
2951 点赞 收藏 8
写回复
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
Task<string> xmlstring = GetPatientList(pid);
这类代码并不是异步操作,这只是同步返回了一个 Task 对象,而已。这种的异步操作是
string xmlstring = await GetPatientList(pid);
是一步到位的“异步”!
回复
关键点要注意,封装异步方法的第一条语句是
await Task.Yield();
一定不要“标题党”,不是说别的地方“长得像”就是异步方法,一定要看逻辑!在你调用同步方法之前,要先将当前任务释放,然后等到你的同步代码执行完毕之后才通过当前任务返回值。也就是释放控制在返回值之前。

如果你写代码
    public static Task<string> GetHTML(string url)
{
var r = new WebClient().DownloadString(url);
return Task.FromResult(r);
}

那这个就是“标题党”了,这个先调用同步阻塞操作,然后才同时释放任务和返回值,这就是徒有其表。
回复
自己写一个异步方法,给你写一个例子:
using System;
using System.Net;
using System.Threading.Tasks;

namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
test();
Console.WriteLine("..................按任意键结束程序");
Console.ReadKey();
}

public static async void test()
{
var x = await GetHTML("https://bbs.csdn.net/topics/398006051");
Console.WriteLine(x);
}

public static async Task<string> GetHTML(string url)
{
await Task.Yield();
return new WebClient().DownloadString(url);
}
}
}

你会看到,首先是程序执行到最后一条语句,然后等到 csdn 返回了页面才打印结果。这里就将同步阻塞的 DownloadString 函数代码,封装到一个异步的 GetHTML 方法中,这样就不会阻塞进程,随时可以按任意键提前退出系统了。
回复
qq_17386267 2020-10-23
报错怎么处理?
回复
datafansbj 2020-10-23
DCLInterface 不是异步方法,不能使用 await。你可以使用 async 对 DCLInterface 做一下封装,再对封装的函数使用 await。

ps:加载窗与异步有关系吗?不是所有场景都应使用异步,否则容易将简单问题复杂化。
回复
qq_17386267 2020-10-23
引用 2 楼 晨易夕 的回复:
你这个DCLInterface不是异步方法,如果方法是异步方法,你只需要在await之前弹出加载框,await后关闭加载框就好了。
DCLInterface是对方web服务方法
回复
正怒月神 2020-10-23
给你一个异步方法
public static class CallWebAPI
    {
        public static async Task<string> APIPost(string url, string data)
        {
            string result = string.Empty;
            //设置HttpClientHandler的AutomaticDecompression
            var handler = new HttpClientHandler() { AutomaticDecompression = DecompressionMethods.GZip };
            //创建HttpClient(注意传入HttpClientHandler)
            using (var http = new HttpClient(handler))
            {
                //使用FormUrlEncodedContent做HttpContent
                var content = new FormUrlEncodedContent(new Dictionary<string, string>()       
                {
//传递单个值
                  {"", data}//键名必须为空
//传递对象
//{"name","hello"},
//{"age","16"}
                 });
 
                //await异步等待回应
                var response = await http.PostAsync(url, content);
                //确保HTTP成功状态值
                response.EnsureSuccessStatusCode();
                //await异步读取最后的JSON(注意此时gzip已经被自动解压缩了,因为上面的AutomaticDecompression = DecompressionMethods.GZip)
                result = await response.Content.ReadAsStringAsync();
            }
            return result;
        }
 
        static async void APIGet(string url)
        {
            //创建HttpClient(注意传入HttpClientHandler)
            var handler = new HttpClientHandler() { AutomaticDecompression = DecompressionMethods.GZip };
 
            using (var http = new HttpClient(handler))
            {
                //await异步等待回应
                var response = await http.GetAsync(url);
                //确保HTTP成功状态值
                response.EnsureSuccessStatusCode();
 
                //await异步读取最后的JSON(注意此时gzip已经被自动解压缩了,因为上面的AutomaticDecompression = DecompressionMethods.GZip)
                Console.WriteLine(await response.Content.ReadAsStringAsync());
            }
        }
    }
回复
晨易夕 2020-10-23
你这个DCLInterface不是异步方法,如果方法是异步方法,你只需要在await之前弹出加载框,await后关闭加载框就好了。
回复
发帖
C#
创建于2007-09-28

10.5w+

社区成员

.NET技术 C#
申请成为版主
帖子事件
创建了帖子
2020-10-23 11:57
社区公告

让您成为最强悍的C#开发者