3

私は新しい非同期のものについて非常に混乱しています。ASP .NET、WPF、Windows Store、Silverlight 5、およびWindows Phone 8で使用したい仮想関数を含むいくつかのクラスでモデルを実装するポータブルライブラリがあります。これらは、WCF機能、CSharp SQLiteを対象とするか、プラットフォームでオーバーライドされる可能性があります。 -ローカルファイル用の特定のライブラリ。

Windowsストアの世界で同期プログラミングが嫌われている今、どのように設定すればよいですか?ポータブルライブラリに仮想関数の非同期キーワードなどを追加してみましたが、必要なフレームワークがないということです。このライブラリを書き直さずに再利用するにはどうすればよいですか?OOPプログラミングは今完全に死んでいますか?

4

2 に答える 2

2

VSは、.NET4.5asyncおよびWindowsStoreを対象とするポータブルライブラリを喜んで許可します。他のプラットフォーム(特に.NET4.0とSilverlight5)が必要な場合は、Microsoft.Bcl.Asyncをインストールする必要があります。

参照が必要な場合は、AsyncExライブラリのソースを利用できます。コアアセンブリは、Microsoft.Bcl.Asyncに依存するポータブルライブラリです。

于 2013-02-16T13:35:36.077 に答える
0

私が対処している方法は、以前のバージョンから適応させたヘルパー クラスを使用することです。基本的:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using Windows.UI.Core;
using Windows.UI.Xaml;

namespace JTModelsWinStore.Local
{
    public delegate void UseDataDelegate(DataCoordinator data);
    public delegate bool GetDataDelegate(DataCoordinator data);

    public class DataCoordinator
    {
        public DependencyObject Consumer;
        public GetDataDelegate GetDataFunction;
        public UseDataDelegate UseDataFunction;
        public bool GetDataSucceeded;
        public Exception ErrorException;
        public string ErrorMessage;

        public DataCoordinator(
            DependencyObject consumer,
            GetDataDelegate getDataFunction,
            UseDataDelegate useDataFunction)
        {
            Consumer = consumer;
            GetDataFunction = getDataFunction;
            UseDataFunction = useDataFunction;
            GetDataSucceeded = false;
            ErrorException = null;
            ErrorMessage = null;
        }

        public Task GetDataAsync()
        {
            GetDataSucceeded = false;

            Task task = Task.Factory.StartNew(() =>
            {
                if (GetDataFunction != null)
                {
                    try
                    {
                        GetDataSucceeded = GetDataFunction(this);
                    }
                    catch (Exception exception)
                    {
                        GetDataSucceeded = false;
                        ErrorException = exception;
                        ErrorMessage = exception.Message;
                    }
                }

                if (UseDataFunction != null)
                {
                    if (Consumer != null)
                    {
                        var ignored = Consumer.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
                        {
                            UseDataFunction(this);
                        });
                    }
                    else
                        UseDataFunction(this);
                }
            });
            return task;
        }
    }
}

次に、Windows ストア コードで:

private async void ItemView_ItemClick(object sender, ItemClickEventArgs e)
{
    DataCoordinator data = new DataCoordinator(this, Logon, LogonCompleted);
    await data.GetDataAsync();
}

private bool Logon(DataCoordinator data)
{
    LoggedOnUserID = ServiceClient.LogOn(UserName, Password);

    if (LoggedOnUserID == null)
    {
        UserName = "AnonymousUser";
        Password = "";

        if (!String.IsNullOrEmpty(ServiceClient.ErrorMessage))
            data.ErrorMessage = "Log on failed.";

        return false;
    }

    if (!String.IsNullOrEmpty(ServiceClient.ErrorMessage))
    {
        data.ErrorMessage = ServiceClient.ErrorMessage;
        return false;
    }

    return true;
}

private void LogonCompleted(DataCoordinator data)
{
    if (data.GetDataSucceeded && LoggedOnUserID != null)
        pageTitle.Text = "Logged On";
    else
        pageTitle.Text = "LogOn Failed";
}

ヘルパーに 2 つの関数を提供します。1 つはデータを取得するため (低速)、もう 1 つは UI でデータを処理するためです。ネストされた 2 つのラムダで実行できることはわかっていますが、2 つのラムダを非表示にするのが好きです。これは、私のようなベテランにとってより快適です。

私自身だけでなく他の人の利益のためにも、お気軽に批評してください。

于 2013-02-16T06:20:49.253 に答える