مهام سير العمل غير متزامن (F#)

Th هو يصف موضوع الدعم في F# لإجراء حسابات بشكل غير متزامن، التي هو، دون حظر تنفيذ العمل الأخرى. على سبيل المثال، غير متزامن يمكن استخدام حسابات لكتابة تطبيقات التي تحتوي على UIs التي تظل استجابة للمستخدمين أثناء تنفيذ تطبيق العمل الأخرى.

async { expression }

ملاحظات

في بناء الجملة السابق، واحتساب تمثيلها بواسطة expressionهو تعيين إلى تشغيل بشكل غير متزامن، التي هو، يستمر مؤشر ترابط الخلفية كتنفيذ تشغيل مؤشر الترابط الحالي. النوع تعبير هو Async<'a>، الموقع 'aهو النوع الذي تم إرجاعه بواسطة تعبير عند returnاستخدام الكلمة الأساسية. تعليمات برمجية في أحد التعبيرات يشار إليه غير متزامن حظرأو حظر المتزامن.

هناك العديد من الطرق من البرمجة بشكل غير متزامن، و فئة المتزامن يوفر الطرق التي تدعم العديد من السيناريوهات. أسلوب عام لإنشاء Asyncالكائنات التي تمثل حساب أو حسابات الذي تريد تشغيله بشكل غير متزامن، وبعد ذلك يبدأ حسابات هذه باستخدام إحدى الدالات إطلاق. توفر وظائف إطلاق المختلفة طرقاً مختلفة لتشغيل غير متزامن حسابات، والتي تستخدمها يعتمد تشغيل ما إذا كنت تريد استخدام مسار التنفيذ الحالي أو مؤشر ترابط الخلفية إطار عمل.NET كائن مهمة، وما إذا كانت هناك متابعة الوظائف التي يجب أن يعمل عند انتهاء الحساب. على سبيل المثال، لبدء تشغيل غير متزامن الحساب على مسار التنفيذ الحالي، يمكنك استخدام من Async.StartImmediate. عند قيامك حساب غير متزامنة من مؤشر ترابط لواجهة مستخدم، قم بعدم حظر تكرار حلقي الأحداث الرئيسية التي تعالج الاجراءات مستخدم كضغطات المفاتيح و ماوس نشاط، بحيث تبقى استجابة تطبيق الخاص بك.

ربط غير متزامن باستخدام ترك!

في سير عمل غير متزامنة، بعض التعابير والعمليات المتزامنة، وبعض حسابات أطول المصممة لإرجاع نتيجة بشكل غير متزامن. عندما تقوم باستدعاء أسلوب بشكل غير متزامن، عوضاً عادية letربط، يمكنك استخدام let!. التأثير let!هو إلى تمكين تنفيذ إلى المتابعة على عمليات جزئية أو حسابات غير ذلك كما يتم تنفيذها احتساب. بعد الجانب الأيسر من let!إرجاع ربط بقية سير العمل غير متزامن استئناف التنفيذ.

يلي تعليمات برمجية يظهر الفرق بين letو let!. السطر من تعليمات برمجية التي تستخدم letفقط بإنشاء غير متزامن حساب ككائن، يمكنك تشغيله فيما بعد باستخدام، على سبيل المثال، Async.StartImmediateأو من Async.RunSynchronously. السطر من تعليمات برمجية التي تستخدم let!يبدأ احتساب، ومن ثم مؤشر ترابط هو مرحلياً حتى تكون النتيجة هو متوفرة في تنفيذ النقطة التي استمرت.

// let just stores the result as an asynchronous operation.
let (result1 : Async<byte[]>) = stream.AsyncRead(bufferSize)
// let! completes the asynchronous operation and returns the data.
let! (result2 : byte[])  = stream.AsyncRead(bufferSize)

غير متزامن الأوليات

أسلوب يقوم بتنفيذ مهمة غير متزامن مفرد وإرجاع النتيجة هو تسمى اﻷولى غير متزامن هذه مصممة خصيصا للاستخدام مع let!. عدة غير متزامن الأوليات المعرفة في مكتبة الأساسية ب #. انتشار مثل وظائف لتطبيقات الويب التي تم تعريفها في وحدة نمطية من Microsoft.FSharp.عنصر تحكم.WebExtensions: WebRequest.AsyncGetResponse و من عميل ويب.AsyncDownloadString. كل من الأوليات بتحميل بيانات من صفحة ويب الصفحة، تحديد محدد موقع معلومات. AsyncGetResponseتنتجWebResponseكائن, andAsyncDownloadStringينتج عن سلسلة الذي يمثل HTML لصفحة ويب.

يتم مُضمن عدة الأوليات لعمليات ادخال/اخراج غير متزامن في وحدة نمطية? Microsoft.FSharp.عنصر تحكم.CommonExtensions. هذه الطرق ملحق Streamفئة Stream.AsyncRead و Stream.AsyncWrite .

إضافى غير متزامن الأوليات المتوفرة في PowerPack ب #. يمكنك أيضا كتابة الخاص بك غير متزامن الأوليات بتعريف دالة تم تضمينه ذات نص كامل في حظر متزامن.

استخدام وظائف غير متزامنة في.NET Framework التي يتم تصميمها للطرازات الأخرى غير متزامنة مع F# غير متزامن طراز البرمجة، يمكنك إنشاء دالة التي إرجاع على F# Asyncالكائن. كان للمكتبة F# الوظائف التي تجعل هذا سهلة إلى القيام.

مثال

يوضح هذا المثال كيفية استخدام مهام سير العمل غير متزامن لتنفيذ حسابات في متوازى.

في ما يلي تعليمات برمجية سبيل المثال، دالة fetchAsyncيحصل على نص HTML الذي تم إرجاعه من طلب ويب. fetchAsyncيحتوي على الدالة غير متزامن حظر من تعليمات برمجية. عندما يتم إجراء ربط بالنتيجة غير متزامن الأولية، في هذه الحالة AsyncDownloadString ، let!يستخدم بدلاً من let.

استخدام دالة من Async.RunSynchronously لتنفيذ غير متزامن العملية وانتظار النتيجة الخاصة بها. كـ سبيل مثال، يمكنك ينفذ العمليات كـ ynchronous متعددة في نفس الوقت باستخدام الدالة كـync.متوازى مع Async.RunSynchronouslyدالة. Async.Parallelتأخذ دالة قائمة Asyncالكائنات، ومجموعات للتعليمة البرمجية لكل Asyncكائن مهمة قيد التشغيل متوازى، وإرجاع Asyncالكائن الذي يمثل متوازى حساب. فقط لعملية واحدة، يمكنك استدعاء Async.RunSynchronouslyإلى بدء التنفيذ.

runAllثلاث مهام سير العمل غير متزامن في نفس الوقت يقوم بتشغيل وظيفة و ينتظر حتى أن الجميع إكمالها.

open System.Net
open Microsoft.FSharp.Control.WebExtensions

let urlList = [ "Microsoft.com", "https://www.microsoft.com/"
                "MSDN", "https://msdn.microsoft.com/"
                "Bing", "https://www.bing.com"
              ]

let fetchAsync(name, url:string) =
    async { 
        try
            let uri = new System.Uri(url)
            let webClient = new WebClient()
            let! html = webClient.AsyncDownloadString(uri)
            printfn "Read %d characters for %s" html.Length name
        with
            | ex -> printfn "%s" (ex.Message);
    }

let runAll() =
    urlList
    |> Seq.map fetchAsync
    |> Async.Parallel 
    |> Async.RunSynchronously
    |> ignore

runAll()

راجع أيضًا:

موارد أخرى

مرجع لغة ب #

التعبيرات احتساب (F#)

فئة Control.Async (F #)