কেন সিঙ্ক্রোনাস সংযোগের জন্য এইচটিটিপিপ্লিনেন্ট ব্যবহার করবেন


187

আমি একটি এপিআইয়ের সাথে ইন্টারঅ্যাক্ট করার জন্য একটি ক্লাস লাইব্রেরি তৈরি করছি। আমাকে এপিআই কল করতে হবে এবং এক্সএমএল প্রতিক্রিয়াটি প্রক্রিয়া করতে হবে। আমি HttpClientঅ্যাসিনক্রোনাস সংযোগের জন্য ব্যবহারের সুবিধাগুলি দেখতে পাচ্ছি , তবে আমি যা করছি তা নিখুঁতভাবে সিনক্রোনাস, তাই ব্যবহারের ক্ষেত্রে আমি কোনও উল্লেখযোগ্য সুবিধা দেখতে পাচ্ছি না HttpWebRequest

যদি কেউ কোনও আলো ফেলতে পারে তবে আমি এটির প্রশংসা করব। আমি এটির জন্য নতুন প্রযুক্তি ব্যবহার করার জন্য এক নই।


3
আমি আপনাকে বলতে অপছন্দ করি, তবে উইন্ডোজ নেটওয়ার্কিং অভ্যন্তরীণভাবে কাজ করে (ওরফে সম্পূর্ণতা পোর্ট) কীভাবে এইচটিটিপি-র মাধ্যমে কল আসে তা কখনই সিঙ্ক্রোনাস হয় না।
টমটম


উত্তর:


370

তবে আমি যা করছি তা সম্পূর্ণ সিঙ্ক্রোনাস

আপনি HttpClientঠিক সূক্ষ্ম সিঙ্ক্রোনাস অনুরোধগুলির জন্য ব্যবহার করতে পারেন :

using (var client = new HttpClient())
{
    var response = client.GetAsync("http://google.com").Result;

    if (response.IsSuccessStatusCode)
    {
        var responseContent = response.Content; 

        // by calling .Result you are synchronously reading the result
        string responseString = responseContent.ReadAsStringAsync().Result;

        Console.WriteLine(responseString);
    }
}

যতদূর আপনি কেন HttpClientবেশি WebRequestপরিমাণে ব্যবহার করা উচিত , HttpClientএটি ব্লকের নতুন বাচ্চা এবং পুরানো ক্লায়েন্টের তুলনায় উন্নতি থাকতে পারে।


27
আপনার অ্যাসিঙ্ক পদ্ধতিগুলির সংলগ্ন ব্যবহারটি সম্ভবত আপনার ইউআই থ্রেডটি ব্লক করবে না? আপনি ভালো কিছু বিবেচনা করতে পারেন string responseString = Task.Run(() => responseContent.ReadAsStringAsync()).Result;পরিবর্তে আপনি আবশ্যক এই সমলয় করা।
26:48

13
@ পূর্ববর্তী, হ্যাঁ, Task.Runএকটি থ্রেডপুল থেকে কাজটি আহ্বান .Resultকরা হয়েছে , তবে আপনি এটি থেকে সমস্ত সুবিধা হারাতে এবং আপনি যে থ্রেডটি বলেছিলেন এটি অবরুদ্ধ করে দিচ্ছে .Result(যা সাধারণত মূল UI থ্রেড হয়)।
ডারিন দিমিত্রভ

35
এই পোস্ট অনুসারে ( ব্লগস.এমএসএনএন / বি / পিএফএক্সটিএম / আর্কাইভ / ২ / ২৪ / ১৩ / ১১ / ২৯ .৩৩৮.এএসপিএক্স ) এর .Resultমতো কল করা থ্রেডপুলটি নিঃশেষ করে এবং অচলাবস্থার কারণ হতে পারে।
পিট গ্যারাফানো

16
এই কোডটি সর্বদা অচল হয়ে যাবে যদি প্রধান ইউআই থ্রেডটিতে কোনওnew TaskFactory(TaskScheduler.FromCurrentSynchronizationContext()
উইম কোইনেন

23
সুতরাং, আমি কীভাবে ইউআই থ্রেড থেকে সিটিক্রোনালি এইচটিপিপিলেট ব্যবহার করব? আসুন আমি ইচ্ছাপূর্বক UI 'তে থ্রেড (অথবা আমি একটি কনসোল অ্যাপ্লিকেশন লিখছি) যে পর্যন্ত না আমি HTTP প্রতিক্রিয়া পেতে ... সুতরাং, যদি অপেক্ষা (), ফল (), ইত্যাদি ডেডলক কারণ হতে পারে, এই জন্য নির্দিষ্ট সমাধান অবরোধ করতে চাই ছাড়া ডেডলকের ঝুঁকি এবং ওয়েবক্লিয়েন্টের মতো অন্যান্য ক্লাস ব্যবহার না করে?
ডেক্সটার

26

আমি ডনি ভি উত্তর এবং জোশের পুনরায় পুনরাবৃত্তি করব

"আমি অ্যাসিঙ্ক সংস্করণটি ব্যবহার না করার একমাত্র কারণ হ'ল যদি আমি .NET এর পুরানো সংস্করণটি সমর্থন করার চেষ্টা করতাম যা ইতিমধ্যে অসম সমর্থনে নির্মিত হয়নি" "

(এবং আমার সুনাম থাকলে উত্সাহ দেওয়া)

আমি যদি শেষবারের মতো মনে করতে পারি না তবে আমি HTTPWebRequest স্থিতি কোডগুলি> = 400 এর ব্যতিক্রম ছুঁড়ে ফেলার সত্যতার জন্য কৃতজ্ঞ ছিলাম these এই সমস্যাগুলি সন্ধান করার জন্য আপনাকে অবিলম্বে ব্যতিক্রমগুলি ধরতে হবে এবং এগুলি কিছু ব্যতিক্রমী প্রতিক্রিয়া পদ্ধতিতে ম্যাপ করতে হবে them আপনার কোডে ... বিরক্তিকর, ক্লান্তিকর এবং নিজের মধ্যে ত্রুটিযুক্ত। এটি কোনও ডাটাবেসের সাথে যোগাযোগ করা, বা বেসপোক ওয়েব প্রক্সি বাস্তবায়ন করা হোক না কেন, এটির 'প্রায়' সর্বদা বাঞ্ছনীয় যে এইচটিপি ড্রাইভারটি কেবল আপনার অ্যাপ্লিকেশন কোডটি কী ফিরে এসেছে তা জানান এবং কীভাবে আচরণ করবেন তা সিদ্ধান্ত নিতে আপনাকে ছেড়ে দিন।

অতএব এইচটিপিপ্লেইয়েন্ট সবচেয়ে ভাল।


1
আমি অবাক হয়ে গিয়েছিলাম যে HttpClientনিজেই চারপাশে একটি মোড়ক HttpWebRequest(এটি প্রকৃতপক্ষে অভ্যন্তরীণভাবে সেই WebExceptionজিনিসগুলি ধরে এবং আপনার জন্য রূপান্তর করে HttpResponseMessage)। আমি ভাবতাম স্ক্র্যাচ থেকে সম্পূর্ণ নতুন ক্লায়েন্ট তৈরি করা সহজ হবে easier
দাই

4
আপনার সম্পূর্ণ কোডবেসকে খুব নিম্ন-স্তরের HTTP কলের জন্য পুনর্লিখন না করার মতো প্রচুর ভাল কারণ রয়েছে যা পারফরম্যান্সের সমালোচনাও নয় (তবে মিলিয়ন স্থানে অ্যাসিঙ্কটি প্রবর্তন করবে)।
ফ্র্যাঙ্কবয়

নেট কোর 2-এ আপনি যদি ডায়নামিকএক্সপ্রেসন পার্সার দিয়ে কোনও অভিব্যক্তি গতিশীলভাবে মূল্যায়ন করতে চান তবে অ্যাসিঙ্ক ব্যবহার করা সম্ভব নাও হতে পারে; সম্পত্তি সূচকরা অ্যাসিঙ্ক ব্যবহার করতে পারে না; আমার অবস্থা আমি পরিবর্তনশীল "GetDefaultWelcomeMessage [\" InitialMessage \ "]" যেখানে এই পদ্ধতি একটি HttpCall এবং সূচক বাক্য গঠন পদ্ধতি সিনট্যাক্স "Util.GetDefaultWelcomeMessage (\" InitialMessage \ ")" বাঞ্ছনীয় তোলে মত একটি স্ট্রিং নির্ণয় করা প্রয়োজন
Eugen

7

যদি আপনি একটি শ্রেণিবদ্ধ গ্রন্থাগার তৈরি করে থাকেন তবে আপনার গ্রন্থাগারের ব্যবহারকারীরা আপনার লাইব্রেরিটি অ্যাসিঙ্ক্রোনালি ব্যবহার করতে চাইবেন। আমি মনে করি এটিই এখানে সবচেয়ে বড় কারণ।

আপনার গ্রন্থাগারটি কীভাবে ব্যবহৃত হবে তা আপনিও জানেন না। সম্ভবত ব্যবহারকারীরা প্রচুর এবং প্রচুর অনুরোধগুলি প্রক্রিয়াকরণ করবেন এবং সংযোজিতভাবে এটি করা এটি দ্রুত এবং আরও দক্ষ সম্পাদনে সহায়তা করবে।

আপনি যদি এটি সহজভাবে করতে পারেন তবে আপনার লাইব্রেরির ব্যবহারকারীদের উপর যখন আপনি এটির যত্ন নিতে পারেন তখন প্রবাহকে অ্যাসিক্রোনাস করতে চেষ্টা করার বোঝা চাপানোর চেষ্টা করবেন না।

আমি অ্যাসিঙ্ক সংস্করণটি ব্যবহার না করার একমাত্র কারণ হ'ল যদি আমি .NET এর পুরানো সংস্করণটি সমর্থন করার চেষ্টা করছিলাম যা ইতিমধ্যে অ্যাসিঙ্ক সমর্থনে নির্মিত হয়নি।


আমি দেখতে পাচ্ছি, সুতরাং ক্লাস লাইব্রেরিটিকে অবিচ্ছিন্ন করুন, এবং সিস্টেম ব্যবহারকারীদের এটি সিদ্ধান্ত নিতে অনুমতি দিন যে এটি অ্যাসিঙ্কটি ব্যবহার করবেন, অথবা অপেক্ষা করুন এবং এটি সিঙ্ক্রোনিকভাবে ব্যবহার করবেন?
কেচাপ

এরম, অপেক্ষা করুন কলটিতে নিয়ন্ত্রণ ফিরিয়ে নির্দিষ্ট কলগুলিকে অ্যাসিনক্রোনাস করতে সহায়তা করে।
জোশ স্মিটন

6

আমার ক্ষেত্রে গৃহীত উত্তর কার্যকর হয়নি। আমি একটি এমভিসি অ্যাপ্লিকেশন থেকে এপিআই কল করছিলাম যার কোনও অ্যাসিঙ্ক ক্রিয়া ছিল না।

আমি এটিকে এভাবে কাজ করতে সক্ষম করেছিলাম:

private static readonly TaskFactory _myTaskFactory = new TaskFactory(CancellationToken.None, TaskCreationOptions.None, TaskContinuationOptions.None, TaskScheduler.Default);
public static T RunSync<T>(Func<Task<T>> func)
    {           
        CultureInfo cultureUi = CultureInfo.CurrentUICulture;
        CultureInfo culture = CultureInfo.CurrentCulture;
        return _myTaskFactory.StartNew<Task<T>>(delegate
        {
            Thread.CurrentThread.CurrentCulture = culture;
            Thread.CurrentThread.CurrentUICulture = cultureUi;
            return func();
        }).Unwrap<T>().GetAwaiter().GetResult();
    }

তারপরে আমি এটিকে এটি বলেছিলাম:

Helper.RunSync(new Func<Task<ReturnTypeGoesHere>>(async () => await AsyncCallGoesHere(myparameter)));

1
থেক্সএক্স @ ডারকোনেক্ট ... এটি আমার পক্ষে পুরোপুরি কার্যকর। কেবলমাত্র HttpClient.SendAsync (...)। ফলাফল কখনই এসপনেট হ্যান্ডলারের (.ASHX) এর মধ্যে কাজ করে না।
রাফায়েল কাজুও সাতো সিমিয়াও

3
public static class AsyncHelper  
{
    private static readonly TaskFactory _taskFactory = new
        TaskFactory(CancellationToken.None,
                    TaskCreationOptions.None,
                    TaskContinuationOptions.None,
                    TaskScheduler.Default);

    public static TResult RunSync<TResult>(Func<Task<TResult>> func)
        => _taskFactory
            .StartNew(func)
            .Unwrap()
            .GetAwaiter()
            .GetResult();

    public static void RunSync(Func<Task> func)
        => _taskFactory
            .StartNew(func)
            .Unwrap()
            .GetAwaiter()
            .GetResult();
}

তারপর

AsyncHelper.RunSync(() => DoAsyncStuff());

যদি আপনি সেই ক্লাস পাসটিকে আপনার অ্যাসিঙ্ক পদ্ধতিটিকে প্যারামিটার হিসাবে ব্যবহার করেন তবে আপনি নিরাপদ উপায়ে সিঙ্ক পদ্ধতিগুলি থেকে অ্যাসিঙ্ক পদ্ধতিগুলি কল করতে পারেন।

এটি এখানে ব্যাখ্যা করা হয়েছে: https://cpratt.co/async-tips-tricks/


-1

সমস্ত উত্তর HttpClientপ্রশ্নের উত্তর দেওয়ার পরিবর্তে সুসংগতভাবে ব্যবহারের দিকে মনোনিবেশ করে বলে মনে হচ্ছে ।

HttpClientএটি সাধারণ অনুরোধ / প্রতিক্রিয়া হ্যান্ডলারের চেয়ে বেশি তাই এটি বিভিন্ন নেটওয়ার্কের কিছু বিশেষত্ব নিয়ে কাজ করতে পারে। মূলত আমার ক্ষেত্রে এনটিএলএম প্রক্সি নিয়ে কাজ করা যার জন্য আলোচনার প্রয়োজন, ক্লায়েন্ট এবং প্রক্সি সার্ভারের মধ্যে টোকেন এবং শংসাপত্র সহ একাধিক অনুরোধ / প্রতিক্রিয়া প্রেরণ করা। HttpClient(ব্যবহার করে HttpClientHandler) বিল্ট-ইন মেকানিজম রয়েছে বলে মনে হয় যা একটি পদ্ধতি কল দিয়ে প্রক্সি ছাড়িয়ে সংস্থানগুলি ফেরত দেয় hand


আপনার উত্তরটি কীভাবে এইচটিপিপ্লিনেন্টকে অবিচ্ছিন্নভাবে ব্যবহার করবেন তা ব্যাখ্যা করে না।
ব্যবহারকারী275801

@ user275801 এটি বোবা মন্তব্য। কেউ তা জিজ্ঞাসা করেনি। এটি ডিফল্ট হিসাবে অ্যাসিক্রোনাস।
বিজনিজটাইম
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.