Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# async/await有什么问题?_C#_Multithreading_Async Await - Fatal编程技术网

C# async/await有什么问题?

C# async/await有什么问题?,c#,multithreading,async-await,C#,Multithreading,Async Await,我正在创建一个基本上为我玩游戏的应用程序。它形成突袭,加入突袭,然后发动突袭。我正在尝试异步完成这一切 一些背景:FormRaidAsync、JoinRaidAsync和LaunchRaidAsync都会发出web请求。这些方法本身也被设置为异步的,但是当我运行程序时,它每秒只加入2-3个帐户 我是做错了什么,还是async/await不一定在新线程上运行每个请求?如果是这样的话,我如何调整这段代码以接近10/秒的速度加入帐户?我是否需要使用其他形式的多线程来同时发出更多请求 谢谢大家。如果需要

我正在创建一个基本上为我玩游戏的应用程序。它形成突袭,加入突袭,然后发动突袭。我正在尝试异步完成这一切

一些背景:FormRaidAsync、JoinRaidAsync和LaunchRaidAsync都会发出web请求。这些方法本身也被设置为异步的,但是当我运行程序时,它每秒只加入2-3个帐户

我是做错了什么,还是async/await不一定在新线程上运行每个请求?如果是这样的话,我如何调整这段代码以接近10/秒的速度加入帐户?我是否需要使用其他形式的多线程来同时发出更多请求

谢谢大家。如果需要更多细节,请告诉我

public async Task<string> StartRaidAsync()
{
    string raid_id = String.Empty;

    try
    {
        raid_id = await this.Helper.FormRaidAsync(this.TargetRaid.Id, this.Former.Id, this.TargetRaid.IsBossRaid).ConfigureAwait(false);
        Console.WriteLine("Formed raid with {0}.", this.Former.Name);

        List<Task> joinTasks = new List<Task>();

        foreach (var joiner in this.Joiners)
        {
            try
            {
                joinTasks.Add(this.Helper.JoinRaidAsync(raid_id, joiner.Id));
            }
            catch (Exception)   // Not sure which exceptions to catch yet.
            {
                Console.WriteLine("Error joining {0}. Skipped.", joiner.Name);
            }
        }

        Task.WaitAll(joinTasks.ToArray());

        await this.Helper.LaunchRaidAsync(raid_id, this.Former.Id).ConfigureAwait(false);
        Console.WriteLine("{0} launched raid.", this.Former.Name);
    }
    catch (Exception)   // Not sure which exceptions to catch yet.
    {
        return "ERROR";
    }

    return raid_id;
}
内部Socket.PostAsync:

public async Task<string> PostAsync(string url, string postData)
{
    return await SendRequestAsync(url, postData).ConfigureAwait(false);
}
公共异步任务PostAsync(字符串url、字符串postData)
{
return wait SendRequestAsync(url,postData).configureWait(false);
}
在SendRequestAsync内部:

protected virtual async Task<string> SendRequestAsync(string url, string postData)
{
    for (int i = 0; i < 3; i++)
    {
        try
        {
            HttpWebRequest request = this.CreateRequest(url);

            if (!String.IsNullOrWhiteSpace(postData))
            {
                request.Method = "POST";
                request.ContentType = "application/x-www-form-urlencoded";
                request.ContentLength = postData.Length;
                var stream = await request.GetRequestStreamAsync().ConfigureAwait(false);

                using (StreamWriter writer = new StreamWriter(stream))
                {
                    await writer.WriteAsync(postData).ConfigureAwait(false);
                    await writer.FlushAsync().ConfigureAwait(false);
                }
            }

            using (HttpWebResponse response = (HttpWebResponse)(await request.GetResponseAsync().ConfigureAwait(false)))
            {
                string responseString = String.Empty;

                using (StreamReader reader = new StreamReader(response.GetResponseStream()))
                {
                    responseString = await reader.ReadToEndAsync().ConfigureAwait(false);
                }

                return responseString;
            }
        }
        catch (Exception e)
        {
            Console.WriteLine(e.Message);
        }
    }

    return String.Empty;
}
受保护的虚拟异步任务SendRequestAsync(字符串url、字符串postData)
{
对于(int i=0;i<3;i++)
{
尝试
{
HttpWebRequest请求=this.CreateRequest(url);
如果(!String.IsNullOrWhiteSpace(postData))
{
request.Method=“POST”;
request.ContentType=“application/x-www-form-urlencoded”;
request.ContentLength=postData.Length;
var stream=await request.GetRequestStreamAsync().ConfigureAwait(false);
使用(StreamWriter=新StreamWriter(流))
{
wait writer.WriteAsync(postData).configureWait(false);
wait writer.FlushAsync().configurewait(false);
}
}
使用(HttpWebResponse=(HttpWebResponse)(wait request.GetResponseAsync().ConfigureWait(false)))
{
string responseString=string.Empty;
使用(StreamReader=newstreamreader(response.GetResponseStream())
{
responseString=await reader.ReadToEndAsync().ConfigureAwait(false);
}
回报率;
}
}
捕获(例外e)
{
控制台写入线(e.Message);
}
}
返回字符串。空;
}
我是做错了什么,还是async/await不一定在新线程上运行每个请求

async
/
await
不会创建新线程

如果是这样的话,我如何调整这段代码以接近10/秒的速度加入帐户

异步代码可以同时执行多个请求。当然,这些请求的速度由web服务调用的速度决定

我现在在代码中看到的唯一错误是它混合了阻塞和异步代码。替换:

Task.WaitAll(joinTasks.ToArray());
与:

如果您仍然看到问题,可能是由于您的web服务或其他支持代码(例如
JoinRaidAsync
中的代码)造成的

我是做错了什么,还是async/await不一定在新线程上运行每个请求

async
/
await
不会创建新线程

如果是这样的话,我如何调整这段代码以接近10/秒的速度加入帐户

异步代码可以同时执行多个请求。当然,这些请求的速度由web服务调用的速度决定

我现在在代码中看到的唯一错误是它混合了阻塞和异步代码。替换:

Task.WaitAll(joinTasks.ToArray());
与:


如果您仍然看到问题,可能是由于您的web服务或其他支持代码(例如
JoinRaidAsync
)造成的。

如果您“不确定要捕获哪些异常”,请不要捕获异常。让它冒泡吧。如果您最终发现了一个您不想冒泡的异常,那么您现在就可以准确地知道要捕获哪个异常了。这是有道理的。感谢您指出这一点。请您更具体地说明您遇到了什么问题。当您“还不确定要捕获哪些异常”时,请不要捕获异常。让它冒泡吧。如果您最终发现了一个您不想冒泡的异常,那么您现在就可以准确地知道要捕获哪个异常了。这是有道理的。谢谢你指出这一点。请你更具体地说明你有什么问题。谢谢你回复斯蒂芬。我已经读了很多关于async和Wait的博客文章。我只是把我的脚趾浸入其中,试着去理解它是如何运作的。我已经更新了我的主要问题,以包括实际web请求的流程。如果你发现有什么不对劲的地方,请告诉我。谢谢你的回复。我已经读了很多关于async和Wait的博客文章。我只是把我的脚趾浸入其中,试着去理解它是如何运作的。我已经更新了我的主要问题,以包括实际web请求的流程。如果你马上发现什么不对劲,请告诉我。
await Task.WhenAll(joinTasks.ToArray());