我有一个Windows窗体应用程序,我在其中使用SmtpClient发送电子邮件.应用程序中的其他异步操作使用async/await,理想情况下,我希望在发送邮件时保持一致.
我在发送邮件时显示一个带取消按钮的模态对话框,并将SendMailAsync与form.ShowDialog组合在一起,因为等待发送会阻塞,所以ShowDialog也是如此.我目前的做法如下,但看起来很乱,有没有更好的方法呢?
private async Task SendTestEmail()
{
// Prepare message, client, and form with cancel button
using (Message message = ...)
{
SmtpClient client = ...
CancelSendForm form = ...
// Have the form button cancel async sends and
// the client completion close the form
form.CancelBtn.Click += (s, a) =>
{
client.SendAsyncCancel();
};
client.SendCompleted += (o, e) =>
{
form.Close();
};
// Try to send the mail
try
{
Task task = client.SendMailAsync(message);
form.ShowDialog();
await task; // Probably redundant …Run Code Online (Sandbox Code Playgroud) 有没有比下面更好的方法来确定std :: istream的长度:
std::istream* pcStream = GetSomeStream();
pcStream->seekg(0, ios::end);
unsigned int uiLength = pcStream->tellg();
Run Code Online (Sandbox Code Playgroud)
只是寻求到流的末尾然后寻找原始位置似乎真的很浪费,特别是如果流可能是某些慢速媒体(如CD或DVD)上的文件.