Skip to content

Instantly share code, notes, and snippets.

@devlights
Created April 24, 2015 01:35
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save devlights/a8f5a47960694ed6e36b to your computer and use it in GitHub Desktop.
Save devlights/a8f5a47960694ed6e36b to your computer and use it in GitHub Desktop.
System.IProgress<T>のサンプル2
#region ProgressSamples-03
/// <summary>
/// System.Progress<T>のサンプルです。
/// </summary>
/// <remarks>
/// このクラスは、.NET Framework 4.5から追加された型です。
/// </remarks>
public class ProgressSamples03 : IExecutable
{
class SampleWindow : Window
{
TextBlock _label;
ProgressBar _bar;
Button _btn;
public SampleWindow()
{
InitializeControl();
InitializeEvent();
}
void InitializeControl()
{
Width = 400;
Height = 100;
_label = new TextBlock
{
Text = string.Empty
};
_bar = new ProgressBar
{
Height = 20
,Minimum = 0
};
_btn = new Button
{
Content = "Cancel"
,Margin = new Thickness(300, 0, 0, 0)
};
var panel = new StackPanel();
panel.Children.Add(_label);
panel.Children.Add(_bar);
panel.Children.Add(_btn);
Content = panel;
}
void InitializeEvent()
{
Loaded += async (s, e) =>
{
var tokenSource = new CancellationTokenSource();
var progress = new Progress<ProgressMessage>(SetProgress);
_btn.Tag = tokenSource;
_bar.Maximum = Directory.EnumerateFiles(".").Count();
await Compress(tokenSource.Token, progress);
Title = "DONE";
if (tokenSource.IsCancellationRequested)
{
Title = "CANCEL";
}
};
_btn.Click += (s, e) =>
{
(_btn.Tag as CancellationTokenSource).Cancel();
};
}
async Task Compress(CancellationToken token, IProgress<ProgressMessage> progress)
{
string ZipFilePath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "ZipTest3.zip");
string TmpFilePath = ZipFilePath + ".tmp";
if (File.Exists(ZipFilePath))
{
File.Move(ZipFilePath, TmpFilePath);
}
using (var archive = ZipFile.Open(ZipFilePath, ZipArchiveMode.Create))
{
foreach (var filePath in Directory.EnumerateFiles("."))
{
if (token.IsCancellationRequested)
{
break;
}
progress.Report(new BeginMessage { Message = string.Format("{0}を圧縮しています...", filePath), Token = token });
archive.CreateEntryFromFile(filePath, Path.GetFileName(filePath));
await Task.Delay(1000);
progress.Report(new AfterMessage { Message = string.Format("{0}を圧縮完了", filePath), Token = token });
}
}
if (token.IsCancellationRequested)
{
File.Delete(ZipFilePath);
if (File.Exists(TmpFilePath))
{
File.Move(TmpFilePath, ZipFilePath);
}
}
else
{
if (File.Exists(TmpFilePath))
{
File.Delete(TmpFilePath);
}
}
}
void SetProgress(ProgressMessage message)
{
if (message.Token.IsCancellationRequested)
{
_label.Text = "処理はキャンセルされました。";
return;
}
_label.Text = message.Message;
if (message is AfterMessage)
{
_bar.Value++;
}
}
class ProgressMessage
{
public string Message
{
get;
set;
}
public CancellationToken Token
{
get;
set;
}
}
class BeginMessage : ProgressMessage {}
class AfterMessage : ProgressMessage {}
}
public void Execute()
{
var app = new Application();
app.Run(new SampleWindow());
}
}
#endregion
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment