�@�������̒��ɂ́A����t���[�icontrol flow�j��͒ʏ�̓����I�ȃR�[�h�ƕς��Ȃ����̂������B�t���[�`���[�g��V�[�P���X�}�������ƁA�} 5�Ɏ����悤�ɁA�����R�[�h�Ɠ����\���ɂȂ���̂��B
�@���̎�ނ̔������́A�X���b�h�E���\�[�X�̖��Ӗ��ȘQ����������ړI�Ŏg���B�X���b�h�Q��Ȃ��Ȃ邱�ƂŁA�Ⴆ�A�ȉ��̂悤�ȃ����b�g��������B
�@���z�������ƁA����t���[�������Ȃ̂�����A�} 6�Ɏ����悤�ɁA���������Ɣ������œ����\���̃R�[�h�����������B
�@�} 6�̔������̗�́AC#�̎����o�[�W�����œ���\��̔����\�b�h����сgawait�h�L�[���[�h���g���Ă���B�����\�b�h���g���A�����̏ꍇ�Ƃ܂�������������t���[�\���̃R�[�h�Ŕ�������������B
�@�����ł́A��Ɍ����C#�A���Ȃ킿�AC# 4.0�̏ꍇ�ɂ��āA������t���[�̏�������������Ă������B���̌�A�����o�[�W�����̔����\�b�h�ɂ��Ă��ȒP�ɐG���B
���T���v��
�@�Ⴆ�Έȉ��̂悤�Ȃ��̂��l���Ă݂悤�B
�@��̓I�ɂ́AOData�����̌`���Ńf�[�^��Ԃ��B�����ł́ANuGet�M�������Ō��J����Ă����p�b�P�[�W�̈ꗗ���擾���Ă݂悤�B�} 7�ɁA�p�b�P�[�W�ꗗ���u���E�U�ł̎擾���ʂ̗�������B�����AtomPub�`����XML�f�[�^�ɂȂ��Ă��āA�} 8�Ɏ����悤�ɁA�����ɑ������擾���邽�߂�URL�������Ă���B
����������t���[
�@���̏������I�ȃR�[�h�ŏ����ƁA���X�g 3�̂悤�ɂȂ�B
public void LoadTitles()
{
var wc = new WebClient();
string url = startUrl;
while (!string.IsNullOrEmpty(url))
{
var body = wc.DownloadString(url); // Web����f�[�^�擾
var titles = ExtractTitles(body); // �f�[�^�̍\�����
foreach (var title in titles)
{
_titles.Add(title);
}
url = GetNextUrl(body);
}
}
�@�u_titles�v�͕\����̃��X�g�{�b�N�X�ɂЂ��t����R���N�V�����ŁA�uExtractTitles�v�ƁuGetNextUrl�v�͕ʓr��`���ꂽ���\�b�h�ł���B�����ŁAWeb����̃f�[�^�擾�̕����i���uDownloadString�v���\�b�h�j�͂��Ȃ�̎��Ԃ�v����B�܂��A����قǂł͂Ȃ��ɂ��Ă��A�f�[�^�̍\����́i���uExtractTitles�v���\�b�h�j������Ȃ�Ɏ��Ԃ�������B
�@���R�A���̂܂��s����ƁA�A�v���P�[�V�������t���[�Y���Ă��܂��i�f�[�^�ʂ�����Ȃ�ɑ������߁A�����̓t���[�Y����j�B���̂��߁ADownloadString���\�b�h��ExtractTitles���\�b�h����Ɏ��s����K�v������B
�����[�v���܂܂Ȃ�������t���[
�@������t���[���A���[�v���܂܂Ȃ��ꍇ�͂���قǓ���Ȃ��B�Ⴆ�Ώ�L�̗�ł����ƁA�f�[�^�擾��1�y�[�W�����ł����Ȃ�while���[�v�͕s�v���B
�@���̏ꍇ�ATask�N���X���g����Ȃ�R�[�h�̋L�q�͂܂��������y�ŁA���X�g 4�̂悤�ɂȂ�B�������AWebClient�N���X�ɑ��āA���X�g 5�̂悤�Ȋg�����\�b�h���`���Ă���B
public void Load1PageAsync()
{
var wc = new WebClient();
wc.DownloadStringTaskAsync(startUrl) // ����DownloadString
.ContinueWith(t => ExtractTitles(t.Result)) // ����ExtractTitles
.ContinueWith(t =>
{
foreach (var title in t.Result.Distinct())
{
_titles.Add(title);
}
}, TaskScheduler.FromCurrentSynchronizationContext());
}
public static Task<string> DownloadStringTaskAsync(this WebClient c, string uri)
{
var tcs = new TaskCompletionSource<string>();
DownloadStringCompletedEventHandler handler = null;
handler = (sender, e) =>
{
if (e.Cancelled) tcs.TrySetCanceled();
else if (e.Error != null) tcs.TrySetException(e.Error);
else tcs.TrySetResult(e.Result);
c.DownloadStringCompleted -= handler;
};
c.DownloadStringCompleted += handler;
c.DownloadStringAsync(new Uri(uri));
return tcs.Task;
}
�@���̓����ł̃R�[�h�Ƃ����Ԃ�ς���Ă��܂������A�菇�ǂ���ɏォ�珈��������ł��邾���ATask�N���X�o��ȑO�Ɣ�ׂ�܂�������₷���Ȃ��Ă���B
�����[�v���܂ޔ�����t���[�iC# 4.0�j
�@���́A���[�v�����������܂ސ���t���[�̏ꍇ���B�O�߂̂悤�ȁAContinueWith���\�b�h���Ȃ��ł������������ł��Ȃ��Ȃ�B�����œo�ꂷ��̂��A�����o�[�W������C#�œ������������\�b�h�ł���B
�@���������̑O�ɁA�����C# 4.0�ł̉�����I�ȕ��@���Љ�Ă������B���X�g 6�Ɏ����悤�ɁA�C�e���[�^�\���iyield return�j���g���Ĕ�����t���[��������@������B
public Task LoadTitlesAsyncPattern()
{
return StartAsyncMethod(LoadTitlesIterator());
}
public IEnumerator<Task> LoadTitlesIterator()
{
var wc = new WebClient();
string url = startUrl;
while (!string.IsNullOrEmpty(url))
{
var tBody = wc.DownloadStringTaskAsync(url);
if (!tBody.IsCompleted)
yield return tBody;
var body = tBody.Result;
var tTitles = Task.Factory.StartNew(() => ExtractTitles(body));
if (!tTitles.IsCompleted)
yield return tTitles;
var titles = tTitles.Result;
�c�c�㗪�c�c // �c��͓��������Ɠ���
}
}
private static Task StartAsyncMethod(IEnumerator<Task> e)
{
Action a = null;
var tcs = new TaskCompletionSource<object>();
var scheduler = TaskScheduler.FromCurrentSynchronizationContext();
a = () =>
{
if (e.MoveNext())
{
var t = e.Current;
t.ContinueWith(_ => a(), scheduler);
}
else tcs.TrySetResult(null);
};
a();
return tcs.Task;
}
�@�����Łi���X�g 3�j��LoadTitles���\�b�h�ƁA���Łi���X�g 6�j��LoadTitlesIterator���\�b�h�̈Ⴂ�́A��^�I�Ȓu�������݂̂ŁA�} 9�Ɏ����Ƃ���ł���B
�����[�v���܂ޔ�����t���[�iC#�����o�[�W�����j
�@�} 9�̂悤�Ȓu�������͊��S�ɋ@�B�I�ɍs������̂ŁA�����C#�^VB�R���p�C���ɂ�点�Ă��܂����Ƃ����̂��A�����o�[�W�����œ������������\�b�h�ł���B���X�g 7�Ɏ����悤�ɁA���\�b�h��async�C���q�A�������̎�O��await�L�[���[�h��t���邾���ŁA������t���[��������悤�ɂȂ�B
public async Task LoadTitlesAsync()
{
var wc = new WebClient();
string url = startUrl;
while (!string.IsNullOrEmpty(url))
{
var body = await wc.DownloadStringTaskAsync(url);
var titles = await Task.Factory.StartNew(() => ExtractTitles(body));
�c�c�㗪�c�c // �c��͓��������Ɠ���
}
}
�@����ŁA�����u���z�������Ɓv�Ɛ��������悤�ȁA�u�����Ɣ��ŁA��������t���[���悤�ȃR�[�h�ŏ����v�������ł���悤�ɂȂ�B
�@�Ō�Ɏ��̃y�[�W�ŁA���f�[�^�t���[���������B
Copyright© Digital Advantage Corp. All Rights Reserved.