C# 如何在Xamarin表单中创建一个Httpclient实例

C# 如何在Xamarin表单中创建一个Httpclient实例,c#,android,ios,xamarin,singleton,C#,Android,Ios,Xamarin,Singleton,是否可以在OnStart()的Xamarin Forms应用程序中创建一个httpclient实例,并在我的应用程序中的任何地方使用它?是的,您可以对应用程序中的所有请求使用相同的httpclient。但您需要注意,如果有API具有不同的基本URL或头信息,那么您需要为此创建另一个httpclient 我要做的是我有一个类来管理HttpClient实例。如果没有与HttpConfig匹配的实例,它将创建并存储它。如果已经存在一个实例,它将只返回它 代码示例(HttpService被注入依赖项):

是否可以在
OnStart()
的Xamarin Forms应用程序中创建一个
httpclient
实例,并在我的应用程序中的任何地方使用它?

是的,您可以对应用程序中的所有请求使用相同的httpclient。但您需要注意,如果有API具有不同的基本URL或头信息,那么您需要为此创建另一个httpclient

我要做的是我有一个类来管理HttpClient实例。如果没有与HttpConfig匹配的实例,它将创建并存储它。如果已经存在一个实例,它将只返回它

代码示例(HttpService被注入依赖项):


是的,您可以对应用程序中的所有请求使用相同的httpclient。但您需要注意,如果有API具有不同的基本URL或头信息,那么您需要为此创建另一个httpclient

我要做的是我有一个类来管理HttpClient实例。如果没有与HttpConfig匹配的实例,它将创建并存储它。如果已经存在一个实例,它将只返回它

代码示例(HttpService被注入依赖项):


这不是一个好主意,HttpClient应该在ad-safe中调用,并且应该是一次性的,以便正确关闭所有网络connections@OrcusZ那根本不是真的。您应该完全重用HttpClient的单个实例@WillDecker那么MS Doc&Sources是错的?您可以使用单个实例或createInstance方法。但是,您应该检查是否需要处理该实例。此外,HttpClient已经是线程安全的,但不是所有的方法,因此您应该在线程安全的环境中使用这些方法scenario@OrcusZ您应该重用HttpClient。它会在create上创建昂贵的资源。它是线程安全的,因此没有理由持续使用昂贵的资源。@NickTurner wow all thread^^。是的,这是真的,我读了很多关于xForms中的异步调用和http调用的书,最好只保留一个连接以提高性能:)不是一个好主意,HttpClient应该在AD-safe中调用,并且应该是一次性的,以便正确关闭所有网络connections@OrcusZ那根本不是真的。您应该完全重用HttpClient的单个实例@WillDecker那么MS Doc&Sources是错的?您可以使用单个实例或createInstance方法。但是,您应该检查是否需要处理该实例。此外,HttpClient已经是线程安全的,但不是所有的方法,因此您应该在线程安全的环境中使用这些方法scenario@OrcusZ您应该重用HttpClient。它会在create上创建昂贵的资源。它是线程安全的,因此没有理由持续使用昂贵的资源。@NickTurner wow all thread^^。是的,这是真的,我读了很多关于xForms中的异步调用和http调用的书,为了提高性能,最好只保留一个连接:)Singleton模式你能给我一个管理Httpclient的类的示例吗?Singleton模式你能给我一个管理Httpclient的类的示例吗?
public class HttpService : IHttpService
{
    private static readonly int MAX_CLIENT = 5;

    private Dictionary<HttpConfig, HttpClient> mClients;
    private Queue<HttpConfig> mClientSequence;

    public HttpService()
    {
        mClients = new Dictionary<HttpConfig, HttpClient>();
        mClientSequence = new Queue<HttpConfig>();
    }

    private HttpClient CreateHttpClientAsync(HttpConfig config)
    {
        HttpClient httpClient;

        if (mClients.ContainsKey(config))
        {
            httpClient = mClients[config];
        }
        else
        {
            // TODO: Create HttpClient...

            if (mClientSequence.Count >= MAX_CLIENT)
            {
                // Remove the first item
                var removingConfig = mClientSequence.Dequeue();
                mClients.Remove(removingConfig);
            }

            mClients[config] = httpClient;
            mClientSequence.Enqueue(config);
        }

        return httpClient;
    }
...
}
public override bool Equals(object obj)
{
    // Logic to determine whether it is same config
}