デリゲートに渡すメッセージでラベルを更新する必要がある aspx Web ページがありますが、これを行うたびにラベルが更新されません。以下にいくつかのコードを示します。
default.aspx
<!-- This table has a surrounding updatepanel -->
<asp:TableRow>
<asp:TableCell><asp:Button id="encrypteer" Text="Encrypteer" runat="server" OnClick="encrypteer_Click" ToolTip="Encrypteer uw bestand" /></asp:TableCell>
<asp:TableCell><asp:Button id="decrypteer" runat="server" Text="Decrypteer" OnClick="decrypteer_Click" ToolTip="Decrypteer uw bestand" /></asp:TableCell>
</asp:TableRow>
<asp:TableRow ForeColor="Blue">
<asp:TableCell ID="infoCell" runat="server" ColumnSpan="2">
Info: <asp:Label ID="lblInfo" runat="server" Text="Cryptografie nog niet gestart." />
</asp:TableCell>
</asp:TableRow>
<asp:TableRow ForeColor="Red">
<asp:TableCell ID="errorCell" runat="server" ColumnSpan="2">
Fouten: <asp:Label ID="lblError" runat="server" Text="Geen fouten." />
</asp:TableCell>
</asp:TableRow>
default.aspx.cs (分離コード):
protected void encrypteer_Click(object sender, EventArgs e)
{
if (getKeys())
{ // Ingevoerde sleutels ophalen
if (taal.SelectedIndex == 0) //crypto.DoCryptFile(EncryptNoLibraries.CryptType.ENCRYPT, sleutels); // en deze meegeven in de encryptieklasse
{
crypto = new EncryptNoLibraries(@"C:\Users\Robbie\TestDES\test.txt", @"C:\Users\Robbie\TestDES\des.txt");
crypto.feedbackInfo += new EncryptNoLibraries.Feedback(setFeedback);
object[] allArgs = { EncryptNoLibraries.CryptType.ENCRYPT, lstSleutels };
object args = allArgs;
ThreadPool.QueueUserWorkItem(new WaitCallback(crypto.DoCryptFile), args);
}
else if (taal.SelectedIndex == 1)
EncryptLibraries.EncryptFile(@"C:\Users\Robbie\TestDES\test.txt", @"C:\Users\Robbie\TestDES\des.txt", txtSleutel.Text);
}
}
最後に、イベントとデリゲートが存在するクラス:
public class EncryptNoLibraries
{
public event Feedback feedbackInfo;
public EventArgs e = null;
public delegate void Feedback(String message, bool info);
public enum CryptType : int { ENCRYPT, DECRYPT };
private CryptType cryptType;
//More irrelevant declarations
public EncryptNoLibraries()
{ }
public EncryptNoLibraries(String strFilePath, String strPathToSave)
{
this.strPathForSourceFile = strFilePath;
this.strPathToDestinationFile = strPathToSave;
}
public void DoCryptFile(object args)
{
//CryptType type, List<byte[]> desSleutels
object[] allArgs = (object[])args;
cryptType = (CryptType) allArgs[0];
sleutels = (List<byte[]>) allArgs[1];
if (cryptType == CryptType.ENCRYPT)
strType = "encrypteren";
else
strType = "decrypteren";
if (strPathForSourceFile.Equals(String.Empty)) // Als geen bestand gekozen werd...
feedbackInfo(String.Format("Kies een bestand voor u gaat {0}.", strType), false); // geven we een gepaste tekst.
else
{
List<BitArray> lstSplittedFile = splitFileIntoBlocksOf64Bits(); //Gesplitst bestand ophalen (Lijst van BitArrays[64])
//feistel.setKey(new BitArray(sleutelEen)); //De 16 subsleutels laten genereren
feistel.setKey(Arrays.ReverseBitArray(new BitArray(sleutels[0])));
lstCodedFile = new ArrayList(lstSplittedFile.Count); //Fills the list with empty byte arrays
feedbackInfo(String.Format("Bezig met {0}: DES", strType), true);
//This function goes on a while with a few occurrences of feedBackInfo(String, bool)
これで、メソッド DoEncrypt が QueueUserWorkItem に追加されるたびに、完全に実行され、すべてが正しく行われます。デバッグ中に、コード ビハインドのメソッド feedbackInfo が正しく呼び出されることに気付きました。
public void setFeedback(String message, bool info)
{
if (info)
{
lblInfo.Text = message;
}
else
{
lblError.Text = message;
}
}
ThreadPool 内から feedbackInfo メソッドを 3 回呼び出すと、実際には 3 回呼び出されるため、このメソッドは機能すると思います。両方のラベルの Text プロパティに、以前に割り当てられた値が含まれるたびに。
したがって、唯一の問題は、ラベル テキスト プロパティが変更されるたびにページが変更されないことです。何か案は?