c# - عربي - معنى كلمة عنوان بالانجليزي




ما ميزة C#الجديدة التي تنتظرها؟ (4)

إذا اضطررت إلى تطبيقه في Java ، فسيبدو الأمر كما يلي:

/**
 * @author Ilya Gazman
 */
public abstract class SynchronizedTask{

    private ArrayList<Runnable> listeners = new ArrayList<Runnable>();

    private static final ThreadPoolExecutor threadPoolExecutor =  new ThreadPoolExecutor(6, 6, 0, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(1000));

    public final void await(Runnable listener){
        synchronized (this) {
            listeners.add(listener);
        }
    }

    public void excecute(){
        onExcecute();
        for (int i = listeners.size() - 1; i >= 0; i--) {
            Runnable runnable;
            synchronized (this) {
                runnable = listeners.remove(i);
            }
            threadPoolExecutor.execute(runnable);
        }
    }

    protected abstract void onExcecute();
}

سيستخدم التطبيق الخاص بك مثل هذا:

public class Test{
    private Job job = new Job();

    public Test() {
        craeteSomeJobToRunInBackground();
        methode1();
        methode2();
    }

    private void methode1(){
        System.out.println("Running methode 1");
        job.await(new Runnable() {

            @Override
            public void run() {
                System.out.println("Continue to running methode 1");
            }
        });
    }

    private void methode2(){
        System.out.println("Running methode 2");
    }

    private void craeteSomeJobToRunInBackground() {
        new Thread(new Runnable() {

            @Override
            public void run() {
                job.excecute();
            }
        }).start();
    }

    private class Job extends SynchronizedTask{

        @Override
        protected void onExcecute() {
            try {
                Thread.sleep(1000);
            }
            catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("Job is done");
        }
    }
}

هل يمكن لأي شخص أن يشرح ما هي وظيفة await ؟


الإجابة المقبولة حاليًا مضللة. لا await أي شيء مؤقت. بادئ ذي بدء ، يمكن استخدامه فقط في الأساليب أو علامات lambdas async والعودة Task أو لا إذا كنت لا تهتم بتشغيل نسخة Task في هذه الطريقة.

هذا توضيح:

internal class Program
{
    private static void Main(string[] args)
    {
        var task = DoWork();
        Console.WriteLine("Task status: " + task.Status);
        Console.WriteLine("Waiting for ENTER");
        Console.ReadLine();
    }

    private static async Task DoWork()
    {
        Console.WriteLine("Entered DoWork(). Sleeping 3");
        // imitating time consuming code
        // in a real-world app this should be inside task, 
        // so method returns fast
        Thread.Sleep(3000);

        await Task.Run(() =>
            {
                for (int i = 0; i < 10; i++)
                {
                    Console.WriteLine("async task iteration " + i);
                    // imitating time consuming code
                    Thread.Sleep(1000);
                }
            });

        Console.WriteLine("Exiting DoWork()");
    }
}

انتاج:

دخلت DoWork (). النوم 3
async task iteration 0
حالة المهمة: WaitingForActivation
في انتظار الدخول
التزامن مهمة التكرار 1
async مهمة التكرار 2
التزامن مهمة التكرار 3
async مهمة التكرار 4
async مهمة التكرار 5
التزامن مهمة التكرار 6
التزامن مهمة التكرار 7
async مهمة التكرار 8
async مهمة التكرار 9
الخروج من DoWork ()


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

فكر في أنها تشبه إلى حد ما عبارة yield return في أسلوب إنتاج IEnumerable. عندما يصطدم وقت التشغيل yield ، فإنه سيحفظ الحالة الحالية للطريقة ، ويعيد القيمة أو الإشارة التي يتم الحصول عليها. في المرة التالية التي يتم فيها استدعاء IEnumerator.MoveNext () على كائن الإرجاع (الذي يتم إنشاؤه داخليًا بواسطة وقت التشغيل) ، تتم استعادة الحالة القديمة للطريقة إلى المكدس بينما يستمر التنفيذ مع السطر التالي بعد yield return كما لو كنا أبدًا. غادر الطريقة. بدون هذه الكلمة الأساسية ، يجب أن يكون نوع IEnumerator محددًا بشكل مخصص لتخزين الحالة ومعالجة طلبات التكرار ، مع الطرق التي يمكن أن تصبح معقدة جدًا بالفعل.

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

لذا ، فإن هاتين الكلمتين الجديدتين تبسطان بشكل أساسي ترميز العمليات غير المتزامنة ، إلى حد كبير مثل yield return الذي يسَّر عملية إنشاء متغيرات مخصصة. مع بضع كلمات أساسية ومعرفة خلفية قليلة ، يمكنك تخطي كل التفاصيل المربكة والتي غالباً ما تكون عرضة للخطأ لنمط تقليدي غير متزامن. سيكون هذا غير قابل للتطبيق إلى حد كبير في أي تطبيق قائم على أحداث واجهة المستخدم الرسومية مثل Winforms ، WPF of Silverlight.


تحدثوا فقط عن هذا في PDC أمس!

يتم استخدام Await بالتزامن مع المهام (البرمجة المتوازية) في .NET. إنها كلمة رئيسية يتم تقديمها في الإصدار التالي من .NET. يسمح لك أكثر أو أقل "إيقاف" تنفيذ أسلوب انتظار المهمة لإكمال التنفيذ. إليك مثال موجز:

//create and run a new task  
Task<DataTable> dataTask = new Task<DataTable>(SomeCrazyDatabaseOperation);

//run some other code immediately after this task is started and running  
ShowLoaderControl();  
StartStoryboard();

//this will actually "pause" the code execution until the task completes.  It doesn't lock the thread, but rather waits for the result, similar to an async callback  
// please so also note, that the task needs to be started before it can be awaited. Otherwise it will never return
dataTask.Start();
DataTable table = await dataTask;

//Now we can perform operations on the Task result, as if we're executing code after the async operation completed  
listBoxControl.DataContext = table;  
StopStoryboard();  
HideLoaderControl();




async-await