0

指定された単語文書を実用的に開き、ユーザーが開いた文書の編集を終了するのを待ってから先に進みます。ユーザーは、ウィンドウを閉じることによって、完了したことを示します。

ただし、次のコードは機能しません。ドキュメントを編集するまでは機能します。ドキュメントが閉じるのを待っている無限のforループを除いて、すべてがフリーズします。どうすればこれを修正できますか?

bool FormatWindowOpen;
    string FormattedText = "";
    MSWord.Application FormattingApp;
    MSWord.Document FormattingDocument;

    private List<string> ImportWords()
    {
        string FileAddress = FileDialogue.FileName;
        FormattingApp = new MSWord.Application();
        FormattingDocument = FormattingApp.Documents.Open(FileAddress);

        FormattingDocument.Content.Text = "Format this document so it contains only the words you want and no other formatting. \nEach word should be on its own line. \nClose the Window when you're done. \nSave the file if you plan to re-use it." + 
                                    "\n" + "----------------------------------------------------------" + "\n" + "\n" + "\n" +
                                    FormattingDocument.Content.Text; //gets rid of formatting as well
        FormattingApp.Visible = true;
        FormattingApp.WindowSelectionChange += delegate { FormattedText = FormattingDocument.Content.Text; };
        FormattingApp.DocumentBeforeClose += delegate { FormatWindowOpen = false; };
        FormatWindowOpen = true;

        for (; ; ){ //waits for the user to finish formating his words correctly
            if (FormatWindowOpen != true) return ExtractWords(FormattedText);
        }
    }
4

1 に答える 1

1

forループは、UIスレッドをフリーズさせている可能性があります。別のスレッドでforループを開始します。

これは、Rxフレームワークを使用して値を非同期データストリームとして返す例です。

    private IObservable<List<string>> ImportWords()
    {
        Subject<List<string>> contx = new Subject<List<string>>();
        new Thread(new ThreadStart(() =>
            {
                //waits for the user to finish formatting his words correctly
                for (; ; ) 
                { 
                    if (FormatWindowOpen != true) 
                    {
                        contx.OnNext(ExtractWords(FormattedText));
                        contx.OnCompleted();
                        break;
                    }
                }
            })).Start();
        return contx;
    }
于 2012-04-07T22:42:41.013 に答える