本文整理汇总了C#中HashSet.Randomize方法的典型用法代码示例。如果您正苦于以下问题:C# HashSet.Randomize方法的具体用法?C# HashSet.Randomize怎么用?C# HashSet.Randomize使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类HashSet
的用法示例。
在下文中一共展示了HashSet.Randomize方法的4个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C#代码示例。
示例1: ConnectionManagerThread
private void ConnectionManagerThread(object state)
{
Thread.CurrentThread.Name = "ConnectionsManager_ConnectionManagerThread";
Thread.CurrentThread.Priority = ThreadPriority.Lowest;
var connectionManager = state as ConnectionManager;
if (connectionManager == null) return;
try
{
var packetManager = _packetControlManager[connectionManager.Node];
var nodeUpdateTime = new Stopwatch();
var updateTime = new Stopwatch();
updateTime.Start();
var blockDiffusionTime = new Stopwatch();
blockDiffusionTime.Start();
var metadataUpdateTime = new Stopwatch();
metadataUpdateTime.Start();
for (;;)
{
Thread.Sleep(1000);
if (this.State == ManagerState.Stop) return;
if (!_connectionManagers.Contains(connectionManager)) return;
var connectionCount = 0;
lock (_thisLock)
{
connectionCount = _connectionManagers.Count;
}
// PushNodes
if (!nodeUpdateTime.IsRunning || nodeUpdateTime.Elapsed.TotalMinutes >= 3)
{
nodeUpdateTime.Restart();
var nodes = new HashSet<Node>();
lock (_thisLock)
{
foreach (var node in _routeTable.Randomize())
{
if (nodes.Count >= 64) break;
if (node.Uris.Any(n => _succeededUris.Contains(n)))
{
nodes.Add(node);
}
}
foreach (var node in _routeTable.Randomize())
{
if (nodes.Count >= 128) break;
nodes.Add(node);
}
}
if (nodes.Count > 0)
{
connectionManager.PushNodes(nodes.Randomize());
Debug.WriteLine(string.Format("ConnectionManager: Push Nodes ({0})", nodes.Count));
_pushNodeCount.Add(nodes.Count);
}
}
if (updateTime.Elapsed.TotalSeconds >= 60)
{
updateTime.Restart();
// PushBlocksLink
if (connectionCount >= _uploadingConnectionCountLowerLimit)
{
List<Key> targetList = null;
lock (_pushBlocksLinkDictionary.ThisLock)
{
if (_pushBlocksLinkDictionary.TryGetValue(connectionManager.Node, out targetList))
{
_pushBlocksLinkDictionary.Remove(connectionManager.Node);
}
}
if (targetList != null)
{
connectionManager.PushBlocksLink(targetList);
Debug.WriteLine(string.Format("ConnectionManager: Push BlocksLink ({0})", targetList.Count));
_pushBlockLinkCount.Add(targetList.Count);
}
}
// PushBlocksRequest
if (connectionCount >= _downloadingConnectionCountLowerLimit)
{
List<Key> targetList = null;
//.........这里部分代码省略.........
示例2: CreateConnectionThread
private void CreateConnectionThread()
{
for (;;)
{
if (this.State == ManagerState.Stop) return;
Thread.Sleep(1000);
// 接続数を制限する。
{
var connectionCount = 0;
lock (_thisLock)
{
connectionCount = _connectionManagers.Count(n => n.Direction == ConnectDirection.Out);
}
if (connectionCount >= (this.ConnectionCountLimit / 2))
{
continue;
}
}
Node node = null;
lock (_thisLock)
{
node = _routeTable
.ToArray()
.Where(n => !_connectionManagers.Any(m => CollectionUtils.Equals(m.Node.Id, n.Id))
&& !_creatingNodes.Contains(n)
&& !_waitingNodes.Contains(n))
.Randomize()
.FirstOrDefault();
if (node == null) continue;
_creatingNodes.Add(node);
_waitingNodes.Add(node);
}
try
{
var uris = new HashSet<string>();
uris.UnionWith(node.Uris.Take(12));
if (uris.Count == 0)
{
lock (_thisLock)
{
_removeNodes.Remove(node);
_routeTable.Remove(node);
}
continue;
}
foreach (var uri in uris.Randomize())
{
if (this.State == ManagerState.Stop) return;
var connection = _clientManager.CreateConnection(uri, _bandwidthLimit);
if (connection != null)
{
var connectionManager = new ConnectionManager(connection, _mySessionId, this.BaseNode, ConnectDirection.Out, _bufferManager);
try
{
connectionManager.Connect();
if (!ConnectionsManager.Check(connectionManager.Node)) throw new ArgumentException();
_succeededUris.Add(uri);
lock (_thisLock)
{
if (node != connectionManager.Node)
{
this.RemoveNode(connectionManager.Node);
}
if (connectionManager.Node.Uris.Count() != 0)
{
_routeTable.Live(connectionManager.Node);
}
}
_connectConnectionCount.Increment();
this.AddConnectionManager(connectionManager, uri);
goto End;
}
catch (Exception e)
{
Debug.WriteLine(e);
connectionManager.Dispose();
}
}
}
//.........这里部分代码省略.........
示例3: ConnectionManagerThread
private void ConnectionManagerThread(object state)
{
Thread.CurrentThread.Name = "ConnectionsManager_ConnectionManagerThread";
Thread.CurrentThread.Priority = ThreadPriority.Lowest;
var connectionManager = state as ConnectionManager;
if (connectionManager == null) return;
try
{
var messageManager = _messagesManager[connectionManager.Node];
Stopwatch nodeUpdateTime = new Stopwatch();
Stopwatch updateTime = new Stopwatch();
updateTime.Start();
Stopwatch blockDiffusionTime = new Stopwatch();
blockDiffusionTime.Start();
Stopwatch metadataUpdateTime = new Stopwatch();
metadataUpdateTime.Start();
for (; ; )
{
Thread.Sleep(1000);
if (this.State == ManagerState.Stop) return;
if (!_connectionManagers.Contains(connectionManager)) return;
var connectionCount = 0;
lock (this.ThisLock)
{
connectionCount = _connectionManagers.Count;
}
// PushNodes
if (!nodeUpdateTime.IsRunning || nodeUpdateTime.Elapsed.TotalMinutes >= 3)
{
nodeUpdateTime.Restart();
var nodes = new HashSet<Node>();
lock (this.ThisLock)
{
foreach (var node in _routeTable.Randomize())
{
if (nodes.Count >= 64) break;
if (node.Uris.Any(n => _succeededUris.Contains(n)))
{
nodes.Add(node);
}
}
foreach (var node in _routeTable.Randomize())
{
if (nodes.Count >= 128) break;
nodes.Add(node);
}
}
if (nodes.Count > 0)
{
connectionManager.PushNodes(nodes.Randomize());
Debug.WriteLine(string.Format("ConnectionManager: Push Nodes ({0})", nodes.Count));
_pushNodeCount.Add(nodes.Count);
}
}
if (updateTime.Elapsed.TotalSeconds >= 60)
{
updateTime.Restart();
// PushBlocksLink
if (connectionCount >= _uploadingConnectionCountLowerLimit)
{
List<Key> targetList = null;
lock (_pushBlocksLinkDictionary.ThisLock)
{
if (_pushBlocksLinkDictionary.TryGetValue(connectionManager.Node, out targetList))
{
_pushBlocksLinkDictionary.Remove(connectionManager.Node);
messageManager.PushBlocksLink.AddRange(targetList);
}
}
if (targetList != null)
{
try
{
connectionManager.PushBlocksLink(targetList);
Debug.WriteLine(string.Format("ConnectionManager: Push BlocksLink ({0})", targetList.Count));
_pushBlockLinkCount.Add(targetList.Count);
}
catch (Exception e)
{
foreach (var item in targetList)
{
//.........这里部分代码省略.........
示例4: ConnectionsManagerThread
private void ConnectionsManagerThread()
{
var refreshStopwatch = new Stopwatch();
bool refreshThreadRunning = false;
var pushBlockDiffusionStopwatch = new Stopwatch();
pushBlockDiffusionStopwatch.Start();
var pushBlockUploadStopwatch = new Stopwatch();
pushBlockUploadStopwatch.Start();
var pushBlockDownloadStopwatch = new Stopwatch();
pushBlockDownloadStopwatch.Start();
var pushMetadataUploadStopwatch = new Stopwatch();
pushMetadataUploadStopwatch.Start();
var pushMetadataDownloadStopwatch = new Stopwatch();
pushMetadataDownloadStopwatch.Start();
var requestCounts = new VolatileHashDictionary<Key, int>(new TimeSpan(0, 10, 0));
for (;;)
{
Thread.Sleep(1000);
if (this.State == ManagerState.Stop) return;
var connectionCount = 0;
lock (_thisLock)
{
connectionCount = _connectionManagers.Count;
}
if (!refreshStopwatch.IsRunning || refreshStopwatch.Elapsed.TotalSeconds >= 60)
{
refreshStopwatch.Restart();
// トラストにより必要なMetadataを選択し、不要なMetadataを削除する。
Task.Run(() =>
{
if (refreshThreadRunning) return;
refreshThreadRunning = true;
try
{
var lockSignatures = this.OnLockSignaturesEvent();
if (lockSignatures == null) return;
var lockTags = this.OnLockTagsEvent();
if (lockTags == null) return;
_settings.MetadataManager.Refresh(lockSignatures.ToArray(), lockTags.ToArray());
}
catch (Exception e)
{
Log.Error(e);
}
finally
{
refreshThreadRunning = false;
}
});
}
// 拡散アップロード
if (connectionCount > _diffusionConnectionCountLowerLimit
&& pushBlockDiffusionStopwatch.Elapsed.TotalSeconds >= 60)
{
pushBlockDiffusionStopwatch.Restart();
// 拡散アップロードするブロック数を10000以下に抑える。
lock (_thisLock)
{
lock (_settings.DiffusionBlocksRequest.ThisLock)
{
if (_settings.DiffusionBlocksRequest.Count > 10000)
{
foreach (var key in _settings.DiffusionBlocksRequest.Randomize()
.Take(_settings.DiffusionBlocksRequest.Count - 10000))
{
_settings.DiffusionBlocksRequest.Remove(key);
}
}
}
}
// 存在しないブロックのKeyをRemoveする。
lock (_thisLock)
{
lock (_settings.DiffusionBlocksRequest.ThisLock)
{
foreach (var key in _cacheManager.ExceptFrom(_settings.DiffusionBlocksRequest.ToArray()).ToArray())
{
_settings.DiffusionBlocksRequest.Remove(key);
}
}
lock (_settings.UploadBlocksRequest.ThisLock)
{
foreach (var key in _cacheManager.ExceptFrom(_settings.UploadBlocksRequest.ToArray()).ToArray())
{
_settings.UploadBlocksRequest.Remove(key);
//.........这里部分代码省略.........