একটি উইন্ডোজ স্টোর অ্যাপ্লিকেশনে কোরডিসপ্যাচারটি পাওয়ার সঠিক উপায়


83

আমি একটি উইন্ডোজ স্টোর অ্যাপ তৈরি করছি এবং আমার কাছে এমন কিছু কোড রয়েছে যা ইউআই থ্রেডে পোস্ট করা দরকার।

তার জন্য, আমি কোরডিসপ্যাচারটি পুনরুদ্ধার করতে এবং কোডটি পোস্ট করতে এটি ব্যবহার করতে চাই।

দেখে মনে হচ্ছে এটি করার কয়েকটি উপায় রয়েছে:

// First way
Windows.ApplicationModel.Core.CoreApplication.GetCurrentView().CoreWindow.Dispatcher;

// Second way
Window.Current.Dispatcher;

আমি ভাবছি কোনটি সঠিক? বা যদি উভয় সমান হয়?


4
উভয় হয় ধরনের সঠিক এর, কিন্তু এটা নাল করা হবে যদি আপনি এটা কিছু ইতিমধ্যে যে থেকে এটি অ্যাক্সেস করছি না হয়েছে ডেস্প্যাচার অ্যাক্সেসের অনুমোদন দেয়। আপনি যদি এটিতে কোনও ভিউমোডেল বা কন্ট্রোলার ব্যবহার করতে চান, তবে আপনাকে ডিসপ্যাচারটি সাধারণত আপনার App.xaml.cs বা IOC নিয়ামক হিসাবে একটি স্ট্যাটিক সম্পত্তি হিসাবে সংরক্ষণ করতে হবে এবং এটি প্রথম পৃষ্ঠা থেকে সেট করে রাখতে হবে তোমার বোঝা আছে
নেট ডায়মন্ড

উত্তর:


149

এটি পছন্দসই উপায়:

Windows.ApplicationModel.Core.CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(CoreDispatcherPriority.Normal,
() =>
{
    // Your UI update code goes here!
});

এর সুবিধাটি হ'ল এটি মূলটি পায় CoreApplicationViewএবং তাই সর্বদা উপলব্ধ। আরও বিশদ এখানে

দুটি বিকল্প রয়েছে যা আপনি ব্যবহার করতে পারেন।

প্রথম বিকল্প

Windows.ApplicationModel.Core.CoreApplication.GetCurrentView().CoreWindow.Dispatcher

এটি অ্যাপ্লিকেশনটির জন্য সক্রিয় দৃষ্টিভঙ্গি পায় , তবে কোনও মতামত সক্রিয় না করা থাকলে এটি আপনাকে বাতিল করে দেবে । আরও বিশদ এখানে

দ্বিতীয় বিকল্প

Window.Current.Dispatcher

এই সমাধান কাজ করবে না কখন এটি অন্য থ্রেড থেকে বলা হচ্ছে যেমন ফেরৎ নাল পরিবর্তে UI 'তে ডেস্প্যাচার । আরও বিশদ এখানে


আমি এটি চেষ্টা করেছিলাম কিন্তু যখন আমি কোডটি সন্ধান করি তখন প্রতিনিধি কোডটি এখনও "মেইন থ্রেড" নয় বরং একটি কর্মী থ্রেডে চালিত হয়।
রবার্ট অসলারের

4
দয়া করে মনে রাখবেন (উইন্ডোজ 8.1 অন্তত) DispatcherPriority এখন CoreDispatcherPriority হয়
Illidan

4
এটি যতক্ষণ না আমাদের একক এএসটিএ (অ্যাপ্লিকেশন একক থ্রেডেড অ্যাপার্টমেন্ট) থাকে ততক্ষণ কাজ করবে। যদি আমরা "ভাগ করে নেওয়ার লক্ষ্য" বৈশিষ্ট্যটি প্রবর্তন করি তবে একাধিক এএসটিএ রয়েছে (প্রত্যেকে তার নিজস্ব প্রেরণকারী সহ)। এবং তারপরে কোর অ্যাপ্লিকেশন ain মাইনভিউ বাতিল হতে পারে (কারণ এর এএসটিএ এখনও শুরু হয়নি)। সচেতন থাকা!
ইয়ুরি শাকাতুলা

আমি কোর অ্যাপ্লিকেশনটি দেখেছি Mআন-ইউআই থ্রেড থেকে ডাকলে আমার ভিউ আমার প্রোগ্রামটি স্তব্ধ করে দেয়। এটিকে অ্যাক্সেস করার জন্য আমাকে প্রথমে স্টোরআপে কোর অ্যাপ্লিকেশন.মেনভিউ.কোর উইন্ডো.ডিসপ্যাচারকে স্ট্যাশ করতে হয়েছিল।
sjb-sjb

15

যে কারও জন্য সি ++ / সিএক্স ব্যবহার করুন

Windows::ApplicationModel::Core::CoreApplication::MainView->CoreWindow->Dispatcher->RunAsync(
    CoreDispatcherPriority::Normal,
    ref new Windows::UI::Core::DispatchedHandler([this]()
{
    // do stuff
}));

4
"সি ++ ব্যবহার করে উইন্ডোজ রানটাইম এপিআইগুলি লেখার জন্য এবং সেবন করার জন্য, এখানে সি ++ / উইনআরটি রয়েছে This সি ++ / উইনআরটি
রিচার্ড চেম্বারস

2
await CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(
            CoreDispatcherPriority.Normal,
            () => { // your code should be here});

1

যদিও এটি একটি পুরানো থ্রেড, আমি কোনও সম্ভাব্য সমস্যার বিকাশকারীদের দিকে মনোযোগ আকর্ষণ করতে চেয়েছিলাম যা আমাকে প্রভাবিত করেছিল এবং বড় ইউডাব্লুপি অ্যাপগুলিতে ডিবাগ করা অত্যন্ত কঠিন করে তুলেছে। আমার ক্ষেত্রে, আমি ২০১৪ সালে উপরের পরামর্শগুলি থেকে নীচের কোডটি রিফ্যাক্ট করেছিলাম তবে মাঝে মধ্যে মাঝে মাঝে অ্যাপ্লিকেশন হিমশীতল হয়ে যায় যা এলোমেলো প্রকৃতির ছিল।

public static class DispatcherHelper
{
    public static Task RunOnUIThreadAsync(Action action)
    {
        return RunOnUIThreadAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, action);
    }

    public static async Task RunOnUIThreadAsync(Windows.UI.Core.CoreDispatcherPriority priority, Action action)
    {
        try
        {
            await returnDispatcher().RunAsync(priority, () =>
            {
                action();
            });
        }
        catch (Exception ex)
        {
            var noawait = ExceptionHandler.HandleException(ex, false);
        }
    }

    private static Windows.UI.Core.CoreDispatcher returnDispatcher()
    {
        return (Windows.UI.Xaml.Window.Current == null) ?
            CoreApplication.MainView.CoreWindow.Dispatcher :
            CoreApplication.GetCurrentView().CoreWindow.Dispatcher;
    }
}

উপরের দিক থেকে, আমি ডিসপ্যাচারের কলিংয়ের মাধ্যমে অ্যাপ্লিকেশনটি আউট করার অনুমতি দেওয়ার জন্য একটি স্ট্যাটিক ক্লাস ব্যবহার করেছিলাম - একটি একক কলের অনুমতি দিয়ে। 95% সময়ের জন্য, কিউএ রিগ্রেশনের মাধ্যমেও সবকিছু ঠিকঠাক ছিল তবে ক্লায়েন্টরা এখন এবং তারপরে একটি সমস্যা রিপোর্ট করবে। সমাধানটি ছিল নীচের কলটি অন্তর্ভুক্ত করা, আসল পৃষ্ঠাগুলিতে স্থির কল ব্যবহার না করা।

            await Windows.ApplicationModel.Core.CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
            { 

            });

এই ক্ষেত্রে যখন আমার ইউআই থ্রেডটি App.xaml.cs বা আমার সিঙ্গলটন নেভিগেশন সার্ভিস থেকে কল করা বা স্ট্যাকের দিকে ঠেলাঠেলি / পপিং পরিচালনা করানো হয়েছিল তা নিশ্চিত করা দরকার। প্রেরণকারীটি স্পষ্টতই ট্র্যাকটি হারাচ্ছিল যার কোন ইউআই থ্রেড বলা হয়েছিল, যেহেতু প্রতিটি পৃষ্ঠার নিজস্ব ইউআই থ্রেড রয়েছে, যখন স্ট্যাকটিতে মেসেজবাস থেকে বিভিন্ন বার্তা প্রেরণ করা হয়েছিল।

আশা করি এটি অন্যকে প্রভাবিত করতে সহায়তা করে এবং আমি মনে করি যে প্রতিটি প্ল্যাটফর্ম তাদের বিকাশকারীদের জন্য সর্বোত্তম অনুশীলনগুলির একটি সম্পূর্ণ প্রকল্প প্রকাশের মাধ্যমে একটি পরিষেবা করবে would


0

আসলে, আমি এর লাইনে কিছু প্রস্তাব করব:

return (Window.Current == null) ? 
    CoreApplication.MainView.CoreWindow.Dispatcher : 
    CoreApplication.GetCurrentView().CoreWindow.Dispatcher

এইভাবে, আপনার যদি অন্য একটি ভিউ / উইন্ডো খোলা থাকে তবে আপনি ডিসপ্যাচারদের বিভ্রান্ত করবেন না ...

এই ছোট্ট রত্নটি এমনকি উইন্ডো আছে কিনা তা পরীক্ষা করে। যদি কিছুই না হয় তবে মেইনভিউয়ের ডিসপ্যাচার ব্যবহার করুন। যদি কোনও মতামত থাকে তবে এটির একজনের ডিসপ্যাচার ব্যবহার করুন।

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