2

私のシナリオをよりよく説明しましょう。ネットワークドライブから.exeを起動したいのですが。Win XPタスクマネージャでチェックインすると、1つのコンポーネント(プログレスバー)を持つ小さな.net4フォームが約20MBのメモリを消費することに気づきました。したがって、スプラッシュフォームが読み込まれると、タスクバーで約20MBのメモリが使用されます。

したがって、.exeがネットワークドライブから起動された場合、クライアントマシンは、フォーム全体がメモリにロードされてから表示されるまで待機する必要があります。これには約2〜3分かかります。したがって、20MBがロードされるのを待つ必要があります。ネットワークドライブから.exeを起動したときにすぐにスプラッシュ画面を表示するための最良の方法は何でしょうか?20MBが完全にダウンロードされるのを待つ代わりに、クライアントメモリにダウンロードされたのが1MB未満のときにスプラッシュ画面を表示することは可能ですか?これを行う方法について提案をいただけますか?

クライアントマシンのタスクマネージャーを見てこれを確認しました。.exeが約20MBに達するまで、スプラッシュフォームが表示されます。次に、.exeが約40MBに達するまで待機して、メインフォームを表示します。exeがネットワークドライブから起動されてから2秒以内にスプラッシュを表示して、exeの読み込みが約2〜3分で完了することをユーザーに知らせたいと思います。では、これをどのように達成するのでしょうか?

ちなみに、クライアントマシンはオフサイトにあり、マシンを中央ファイルサーバーに接続するVPNがあるため、ロードに時間がかかります。アップロードリンクが最大1Mbであるため、読み込みに時間がかかるのはそのためです。ただし、.exeの読み込みが完了すると、速度が低下することはありません。最善の方法は、ターミナルサービスまたはcitrixを使用することです。しかし、これは今のところオプションではありません。または、クライアントマシンに各.exeをインストールしますが、そのパスをたどりたくないです。

4

5 に答える 5

1

ClickOnce の配置をご覧ください。展開を容易にするために単一のネットワーク コピーを保持できる可能性がありますが、アプリケーションが更新されていない限り、クライアントがアプリケーションをダウンロードする必要がなくなります。

http://msdn.microsoft.com/en-us/library/t71a733d

于 2011-03-04T04:35:55.510 に答える
0

次のことしか行わない2番目のアプリケーションを作成することを検討してください。

  1. スプラッシュ画面を表示する

  2. リモートexeを指す新しいWindowsプロセスを起動します。

-

この質問には、必要なコードの概算が含まれていると思います。

WinFormがProcess.Startによってロードされるタイミングをどのように知ることができますか?

于 2011-03-04T01:53:19.923 に答える
0

タスク マネージャーの [プロセス] タブでのメモリ使用はローカルのみであり、ネットワーク接続されたコンピューターからはダウンロードされません。ネットワーク ドライブからアプリケーションをロードすると、実行可能ファイルのみがダウンロードされ、ローカルで実行されます。これは、すべての OS が常に行ってきた方法であり、サーバー上で実行されたりストリーミングされたりすることはありません。

ここにニュースレター送信アプリケーションがあります。たとえば、15kb exe、ロード時に 4.3mb の RAM を使用します (データのリストが大きいため、これは予想されます)。

VPN 経由で米国のサーバーからローカル マシンにロードされます (私は ADSL 1,512 リンクでオーストラリアにいます...とても遅いです!) アプリケーションを ~1-2 秒でロードし、方法はありません。私は 1 秒で 4.3 MB をダウンロードできます... 私はしたい :)

それで、あなたはあなたの問題について何ができますか?

実行可能ファイルが巨大で、埋め込みリソース (画像、ビデオ、リスト、XML など) が詰め込まれている場合は、代わりにそれらを外部ファイルにして、ユーザーに読み込みウィンドウを表示することができます。ファイルをローカルにキャッシュすることもできます。一度実行すると、アプリケーションの起動が速くなります。リソースへの変更は、アプリケーションを介して確認および再ダウンロードできます

アプリケーションの実行可能ファイルが小さく、アクセスされている外部ファイル/リソースが (ネットワーク フォルダーまたはオンラインで) ない場合は、単にネットワークの問題を管理する必要があります :)

于 2011-03-04T06:30:56.887 に答える
0

.Net ランタイムは、必要に応じてアセンブリのみをロードします。実行可能ファイルをできるだけ小さくして (スプラッシュ スクリーンを表示するために最低限必要なだけ)、残りのコードをより大きなアセンブリに配置すると、理論的にはスプラッシュ スクリーンよりも大きくなります。大きなアセンブリをロードする必要がある前に、非常に迅速に表示できます。

これを達成するための鍵は、.Net フレームワークがいつアセンブリをロードしようとするかを理解することです。より正確には、アセンブリに含まれる型を参照するメソッドの実行を開始する直前にアセンブリをロードします。これをよりよく理解するために、次のプログラムを試してみてください。

// Contained in FirstAssembly.exe
class Program
{
    static void Main()
    {
        PrintLoadedAssemblies("start of Main");
        innerMain();
    }

    static void innerMain()
    {
        PrintLoadedAssemblies("start of innerMain");
        OtherClass obj;
    }

    static void PrintLoadedAssemblies(string point)
    {
        Console.WriteLine("Loaded assemblies at {0}", point);
        foreach (var assembly in AppDomain.CurrentDomain.GetAssemblies())
        {
            Console.WriteLine(assembly.FullName);
        }
    }
}

// Contained in OtherAssembly.dll
class OtherClass
{

}

この知識を武器に、2 番目に大きなアセンブリをロードする前にスプラッシュ スクリーンを表示するには、より大きなアセンブリ内の任意の型を参照するメソッドを実行する前に、スプラッシュ スクリーンが表示されるようにする必要があることがわかりました。これは難しいことです。これをテストするためですが、かなり標準的なスプラッシュ画面がある場合:

static void Main()
{
    Application.Run(new SplashScreen());
}

次に、より大きなアセンブリ内の任意の型を参照する必要がある最初のポイントは、次のようなSplashScreen_Shownイベントのようなものにする必要があります。

void SplashScreen_Shown(object sender, EventArgs e)
{
    (new MainForm()).Show();
    this.Hide();
}

また、これはメイン/UI スレッドで発生するため、より大きなアセンブリが読み込まれている間はスプラッシュ スクリーンが応答しないことに注意してください。これが受け入れられない場合は、MainForm参照を含むメソッドが非同期スレッドになるように上記をリファクタリングする必要があります。 .

于 2011-03-04T07:37:18.253 に答える
-1

回答ありがとうございます。あなたの提案の後、私は次の解決策について考えました。Aは、ネットワークドライブから起動すると、非常にすばやく起動するコンソールアプリケーションを構築しました。2秒以内に。このコンソールアプリケーションは私のスプラッシュ画面になりますが、きれいではありませんが、少なくともユーザーは何かが起こっていることを知っています。コンソールexeは、実際にロードしたい.exeを起動し、少なくともユーザーはそのロードを認識し、ロードに数分かかります。可能であれば、コンソールアプリケーションは残り時間を表示します。コンソールアプリケーションを使用してこれを行う方法を理解する必要があります。メインの.exeがロードされたら、コンソールアプリケーションを閉じる必要があります。

コンソールアプリケーションからこれを行う方法を知っている人はいますか?

于 2011-03-05T04:53:46.563 に答える