Hallo,
ich hätte eine Frage zu einer kleinen Anwendung, die ich aktuell erstelle.
Sie liest die Mails von einem Exchange Server ein, wertet den Body aus und postet dann die Daten an ein PHP Skript auf einem anderen Server. dies geschieht via Timer jede Minute und kann auch manuell per Button ausgelöst werden.
Soweit, so gut.
Wenn nun die Abarbeitung der Mails beginnt, blockiert irgendwie meine UI - ich muss zugeben, mit den Tasks habe ich mich nie groß beschäftigen müssen. Jetzt liegt es wohl auf der Hand.
Kann mir vielleicht jemand etwas unter die Arme greifen, wie ich gleichzeitig die UI bedienbar halte und im Hintergrund die Mails einlese und auch Aktualisierungen an die UI bringe?
Folgender Code friert die UI ein:
C#-Code: |
private void btnManuell_Click(object sender, EventArgs e)
{
timer1.Stop();
FetchNewMail(sender, e);
}
public async void FetchNewMail(object sender, EventArgs e)
{
if (exchange != null)
{
rBFailure.Text = "Emails werden bearbeitet!";
FolderId SharedMailbox = new FolderId(WellKnownFolderName.Inbox, g_id);
SearchFilter searchFilter = new SearchFilter.SearchFilterCollection(LogicalOperator.And, new SearchFilter.IsEqualTo(EmailMessageSchema.IsRead, false));
PropertySet FindItemPropertySet = new PropertySet(BasePropertySet.IdOnly);
ItemView view = new ItemView(999);
view.PropertySet = FindItemPropertySet;
PropertySet GetItemsPropertySet = new PropertySet(BasePropertySet.FirstClassProperties);
GetItemsPropertySet.RequestedBodyType = BodyType.Text;
FindItemsResults<Item> emailMessages = null;
do
{
emailMessages = exchange.FindItems(SharedMailbox, searchFilter, view);
if (emailMessages.Items.Count > 0)
{
int tmp_i = 0;
int tmp_message_counter = emailMessages.Items.Count;
lblMailCountText.Text = tmp_message_counter.ToString();
exchange.LoadPropertiesForItems(emailMessages.Items, GetItemsPropertySet);
foreach (Item Item in emailMessages.Items)
{
tmp_i++;
rBFailure.Text = "Bearbeite Nachricht " + tmp_i.ToString() + " von " + tmp_message_counter.ToString();
if (await postnewDataAsync(Item.Body.Text, "test"))
{
worked_mails++;
lblMailCountWorkText.Text = worked_mails.ToString();
lblMailCountWorkText.Refresh();
}
else
{
failed_mails++;
lblMailCountFailedText.Text = failed_mails.ToString();
lblMailCountFailedText.Refresh();
}
}
rBFailure.Text = "Alle Nachrichten wurden bearbeitet!";
rBFailure.Refresh();
lblMailCountText.Text = "0";
lblMailCountText.Refresh();
}
} while (emailMessages.MoreAvailable);
if (emailMessages.Items.Count <= 0)
{
rBFailure.Text = "Aktuell keine neuen Nachrichten!";
lblMailCountText.Text = "0";
lblMailCountText.Refresh();
}
}
counter = 60;
StartTimer();
pgTimer.Value = 60;
}
private async Task<bool> postnewDataAsync(string data, string action)
{
var values = new Dictionary<string, string>
{
{ "action", action },
{ "data", data }
};
var content = new FormUrlEncodedContent(values);
var response = await client.PostAsync("Skript.php", content);
var responseString = await response.Content.ReadAsStringAsync();
if (responseString.Contains("Erfolg"))
{
return true;
} else
{
return false;
}
}
|
Vielen Dank!